浏览器跨域

跨域是浏览器的同源策略导致

        同源策略是浏览器的一种安全限制,指 https// -> 协议。 www.baidu.com -> 域名。  443 ->端口。必须一样才能进行资源的访问,且只对ajax进行限制, scritp、img、video、audio等带有src属性的标签不会有同源策略限制

当我们在浏览器访问一个地址如  https://www.baidu.com:443/inde.html 他会向服务器获取资源,展示页面。

如果该资源中ajax请求 , 就会去调接口,接口地址只能是 https://www.baidu.com:443/ * 下面的资源,否则就会跨域。

当我们在浏览器访问的资源有调接口时,会向服务器发请求,服务器会返回资源(即使跨域资源是会返回的),只是被浏览器拦截了。

跨域解决方案 

前端:

       1.jsonp(已淘汰) 只能进行get请求,需要后端配合

         利用script标签不会跨域原理,在路径后拼接一个回调函数,后端拿到回调函数,并执行,在执行时传递参数

// 前端
<script type='text/javascript'>
window.jsonpCallback = function (res) {
  console.log(res)
}
</script>
<script src='http://localhost:8080/jsonp?callback=jsonpCallback' type='text/javascript'></script>

// 后端
app.get('/jsonp', (req, res) => {
    console.log(req.query);
    const funcName = req.query.callback  // 前端传递过来的回调函数
    const data = { name: 'zs', age: 22 }
    const scriptStr = `${funcName}(${JSON.stringify(data)})`    // 调用函数,并传递参数给前端
    res.send(scriptStr) // 响应
})

      2.devServer(proxy代理)        

     原理: 浏览器访问的地址是本地启动的devServer服务器,浏览器与本地的devServer服务器是同源的,所以不存在跨域,然后本地服务器再将这次请求转发到目标地址,服务器与服务器之间也不存在跨域。就能拿到数据

        注:devserver是本地服务器,线上没用。线上资源是部署在同一源下,所以不会跨域。如果不是部署在同一源下,只能后端解决

后端:cors (设置请求头 允许访问的源)

        res.setHeader("Access-Control-Allow-Origin","*")     //  * 是表示所有源,也能设置具体源 http://127.0.0.1:5500        

        服务端设置这段代码,浏览器就不会对该服务器响应的数据进行拦截。就能拿到数据

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值