什么是跨域?如何解决?

什么是跨域?

跨域是如何产生的?
违反了同源策略

跨域产生的前提条件:跨域是浏览器为了解决安全性的问题而提出的解决方案(同源策略)

那么什么是同源策略?
我们知道一个url是由协议、域名和端口号组成的,那么这三者有一个不同,就是不同源了,也就是违反了同源策略

在这里插入图片描述
为什么要有同源策略?
浏览器可能同时打开很多个标签,如果没有策略把他们隔开,让他们单独执行,会有什么后果?
比如,现在浏览器打开了a和b,那么服务器就有a和b的信息,此时我在a中手写了一个Ajax请求,想发送给b(我们知道在发送请求的时候会带自己的cookie),那么这个时候Ajax请求就会请求回b的信息,也就是说,我们可以在a页面上操作b页面,这只有两个页面,如果更多呢?会非常混乱,所以同源策略的存在,会防止这中情况的发生。

如何解决跨域问题?

在这里插入图片描述
我们已经知道,因为有了同源策略,浏览器已经获取a了,再获取b会产生跨域,那么如何解决?

1.CORS(Cross-Origin Resource
Sharing)设置请求头解决跨域问题
,这个方法我们可以简单理解为,在获取b之前,浏览器先问问b,你愿意吗?b说了我愿意,浏览器再进行获取
cors请求的分类,根据请求方式和请求头的不同可以分两大类,分别是:简单请求和预检请求
两个请求最大的区别:简单请求只请求一次,预检请求会请求两次,option请求成功之后才会发起真正的请求

  • 简单请求:不触发预检请求 特征:1.属于以下三种请求(head/post/get)
    2.请求头不超出以下几种字段(Accept/Accept-Language/Content-Language/Last-Event-ID/Content-Type)
response.addHeader(s:"Access-Control-Allow-Origin",s1:"允许跨域的页面的url地址")
  • 预检请求:使用option方法发起预检请求到服务器,看看服务器允不允许,可以避免跨域请求对服务器的用户数据产生未预期的影响
    (1)请求方式:除了get、post、head之外的请求,method类型
    (2)请求头包含自定义头部字段
    (3)向服务器发送application/json格式的数据

在这里插入图片描述

response.addHeader(s:"Access-Control-Max-Age",s1:"10")   //发送一次预检请求,10s内服务器没有给出响应,再发送一次;如果10s内返回允许了,发送真实数据

respense.addHeader(s:"Access-Control-Allow-Method",s1:"允许跨域的页面的url地址")  //允许跨域的方法

2.ngnix代理解决跨域
首先我们要了解,服务器与服务器之间是不存在跨域问题的。
为什么?因为浏览器可以同时访问n个网站,但是服务器不能,所以不存在跨域问题
ngnix模拟一个虚拟服务器,
发送数据时:客户端发给nginx,ngnix发给服务端
返回数据时:服务端返回给ngnix,ngnix再返回给服务端

3.jsonp解决跨域(最老):
是利用了一些标签,天然就带有可以跨域的功能
比如说script标签,img标签,link标签都可以,
jsonp只能get请求
实现jsonp接口分四步:

  • 获取客户端发送过来的回调函数的名字
  • 得到jsonp形式发送给客户端的数据
  • 根据前两步得到的数据,拼接出一个函数调用的字符串
  • 把上一步得到的字符串相应给客户端script标签进行解析执行
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的米

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值