跨域解释和常见的跨域解决办法

在这里插入图片描述
浏览器同源策略:浏览器最核心也是最基本的安全功能,根据这个策略,a.com域名下的JavaScript无法跨域操作b.com域名下的对象。比如,baidu.com域名下的页面中包含的JavaScript代码,不能访问google.com域名下的页面内容。
同源指的是同协议、同域名和同端口
常见的跨域解决办法
(1)JSONP
<javaScript>标签src属性可以进行跨域请求,跨域请求的JS脚本代码可以调用当前域的某个函数,功能函数中的ajax请求既可请求与另一脚本同域的资源。因此可以根据需要生成<javaScript>标签,动态调用需要的函数,从而实现跨域
(2)跨域资源共享:CROS
参考文章:http://www.ruanyifeng.com/blog/2016/04/cors.html
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器,只要服务器实现了CORS接口,就可以跨源通信。

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
简单请求

(1) 请求方法是以下三种方法之一:HEAD、GET、POST
(2)HTTP的头信息不超出以下几种字段:
Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type
其中Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

对于简单请求,浏览器直接发出CORS请求,就是在http请求头信息中增加一个Origin字段,用来表示本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。

  • 如果Origin指定的源,不在许可范围内: 服务器会返回一个正常的HTTP回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin,就知道origin指定的源不可以访问
  • 如果Origin指定的源,在许可范围内: 服务器返回的响应,会多出几个头信息字段,都以Access-Control-开头
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar

(1)Access-Control-Allow-Origin
该字段是必须的。它的值要么是请求时Origin字段的值【Origin是请求时的属性】,要么是一个*,表示同意任意跨源请求。
(2)Access-Control-Allow-Credentials
该字段是可选的。它的值是一个布尔值,表示是否允许发送Cookie。
默认情况下,CORS请求默认不发送Cookie和HTTP认证信息。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。
(3)Access-Control-Expose-Headers
该字段是可选的。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
非简单请求
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

(1)预检请求

  • 预检请求用的请求方法是OPTIONS,表示这个请求是用来询问的。请求头中多了3个头信息字段:
Origin: http://api.bob.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header

Access-Control-Request-Method:这个字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法
Access-Control-Request-Headers:指定浏览器CORS请求会额外发送的头信息字段
(2)预检请求的响应

Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000

Access-Control-Max-Age用来指定本次预检请求的有效期,单位为秒,在此期间,不用发出另一条预检请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值