当前位置: 首页 > news >正文

什么网站做教育的比较多织梦做的网站打包在dw修改

什么网站做教育的比较多,织梦做的网站打包在dw修改,山东省住房和城乡建设厅网站主页,百度在线提问文章目录 前言一、跨域是什么?二、跨域的解决1.JSONP2.前端代理dev环境3.后端设置请求头CORS4.运维nginx代理 总结 前言 本文主要介绍跨域问题介绍并提供了四种解决办法。 一、跨域是什么? 准确的来说是浏览器存在跨域问题,浏览器为了安全考…

文章目录

  • 前言
  • 一、跨域是什么?
  • 二、跨域的解决
    • 1.JSONP
    • 2.前端代理dev环境
    • 3.后端设置请求头CORS
    • 4.运维nginx代理
  • 总结


前言

本文主要介绍跨域问题介绍并提供了四种解决办法。


一、跨域是什么?

准确的来说是浏览器存在跨域问题,浏览器为了安全考虑,也就是同源策略的限制,会拒绝跨域请求。
在这里同源策略是指:请求时拥有相同的协议、域名、端口,其中只要有一项不满足就被视为跨域。

主机(http://www.smz.com)是否跨域原因
https://www.smz.com协议不同
http://www.smz.com:8001端口不同
http://www.baidu.com域名不同
http://www.smz.com/index.html符合三个条件

跨域产生:

前端,这里直接请求,就会产生跨域问题

 fetch('http://localhost:3000/api/json').then(res=>res.json()).then(res=>{console.log(res)})

后端,这里不做处理直接返回数据

app.get('/api/json',(req,res)=>{res.send({name:'smz'})
})

这里浏览器报错,是因为端口不一致导致跨域

跨域

这里值得注意的是,在发送跨域请求时,浏览器会先发送一个OPTIONS请求(预检请求),用来获取服务器对跨域的支持情况。以下几种跨域请求都会触发预检请求,如果服务端在请求头中返回了适当的跨域头,则允许发送实际请求,否则拒绝。而其他简单请求则会正常发送。

  • 使用了非简单请求
    简单请求包括:GETHEADPOST
    请求头部只包含以下字段:AcceptAccept-LanguageContent-LanguageContent-Type(仅限于application/x-www-form-urlencodedmultipart/form-datatext/plain)。
  • 自定义请求头部:跨域请求中的请求头部包含了自定义的字段

二、跨域的解决

1.JSONP

这种方式需要前后端一起协商解决,原理就是动态创建script标签,因为script标签src属性不受跨域限制。但是script标签只能发送get请求,是不安全的。

后端返回的是一个函数 这个函数前端需先定义好 他会把返回的值注入到这个函数的参数中,其中具有代表性的就是百度搜索跨域请求就是jsonp实现的。

前端:

<script>let text = document.querySelector('#text')// 动态创建script标签,添加scr请求地址拼接函数名称const jsonp = (name) =>{let script = document.createElement('script')script.src = 'http://localhost:3000/api/jsonp?callback=' + namedocument.body.appendChild(script)return new Promise((resolve)=>{window[name] = (data) =>{resolve(data)}})}// 利用函数接收返回的参数jsonp(`callback${new Date().getTime()}`).then(res=>{text.textContent = resconsole.log(res)})
</script>

后端:这里用Node

const express = require('express')
const app = express()
app.get('/api/jsonp',(req,res)=>{const {callback} = req.query // 函数名res.send(`${callback}('hello jsonp')`) //返回并将数据充当函数参数返回
})app.listen(3000,()=>{console.log('server is running')
})

jsonp

跨域问题可以通过以下几种方式解决:

  1. JSONP(JSON with Padding):通过动态创建

需要注意的是,跨域问题只存在于浏览器中,对于服务器端来说并不存在跨域问题。因此,以上解决方案都是在浏览器端实现的。


2.前端代理dev环境

利用vite或者webpack通过代理,将请求转发到对应的服务器上。

vite或者webpack配置文件,这里用vite

import {defineConfig} from 'vite'export default defineConfig({server:{proxy:{'/api':{target:'http://localhost:3000',changeOrigin:true,// 开启跨域}}}
})

请求:

 fetch('/api/json').then(res=>res.json()).then(res=>{console.log(res)})

vite


这里浏览器显示的是前端端口发送的请求,实际上已经通过请求转发给3000端口了,是vite开启了一个Node服务,在Node服务这里做了请求转发的操作。
在这里插入图片描述

只在开发环境生效,项目上线得用nginx

3.后端设置请求头CORS

后端设置跨域很简单,只要在返回请求头中带入允许跨域的接口地址就行Access-Control-Allow-Origin

将其值设置为*可以放行全部,但是不建议这样放行全部,可以指定ip。在这里要注意一下非简单请求是会发一个预检请求的,这个预检请求需要放行带上响应头返回。保证请求能够跨域。

预检(options)请求放行返回,这里使用后端是node

app.options('/api/*', (req,res) => {res.setHeader("Access-Control-Allow-Origin","*")res.setHeader("Access-Control-Allow-Headers", "*");res.end()
})

其他请求带响应头

res.setHeader('Access-Control-Allow-Origin','*')

CORS

其实在产生跨域问题时,浏览器就提示我们这样的做法了

跨域

4.运维nginx代理

在项目上线时,通过nginx代理进行请求转发。

在nginx配置文件nginx.conf中加入代理配置

  location /api {proxy_pass http://127.0.0.1:5000;}

nginx


总结

本文记录了,跨域问题在前后端的解决方法,以及不同环境下的解决方案。

http://www.yayakq.cn/news/844908/

相关文章:

  • 庄河网站建设公司品牌推广名词解释
  • 优秀排版设计网站大型网站开发企业
  • 东莞规划局官方网站中信建设有限责任公司杨建强
  • 家乡ppt模板免费下载网站网站需求建设书
  • 网站的功能建设客户案例 网站设计
  • 绿色大气网站模板wordpress主页不显示
  • 前期的网站建设的难度网页设计知名网站
  • 青海网站建设哪个最好seo推广公司排名
  • html5 手机 手机网站网站做流量怎么赚钱的
  • 四川整站优化专业的机构seo外包方法
  • 浙江电信关于网站备案信息核实的公告护肤网站模版
  • 营销型网站建设熊掌号php做简单网站教程视频教程
  • 51CTO学院个人网站开发视频js网页特效案例
  • 百度建立网站wordpress手机单页面
  • 蚌埠建设银行网站只有域名如何做网站
  • 品牌网站建设目标重庆在线开放课程平台
  • 除尘环保设备网站模板做兼职的网站有哪些
  • 做网站月入1000郑州高端网站建设公司
  • 申请建设网站的报告行业网站开发费用
  • 郑州公司网站建设wordpress静态网站博客
  • 陕西高端品牌网站建设价格化妆品网站制作需要
  • 有哪些可以做翻译的网站建设网站需要做的工作
  • 在萍乡谁可以做网站苏州保洁公司多少钱一个平方
  • 长春净月潭建设投资集团网站哪个公司的网站做的好
  • wordpress 取消响应式厦门seo关键词优化培训
  • 济南网站的公司哪家好wordpress新界面
  • 网站产品图怎么做的开发公司网签价格
  • 能够做外贸的网站有哪些问题银川网站建设广告公司名单
  • 广西南宁网站推广北京赛车网站建设
  • 网站织梦如何让会员注册如何做好品牌网站建设方案