CORS解决前后端跨域问题

CORS跨域:跨域资源共享 cross-origin resource sharing

跨域资源共享——CORS

浏览器同源策略下的跨域访问解决方案:

如果站点A允许站点B的脚本访问其资源,必须在http响应中显示的告知浏览器:站点B是被允许的

访问站点A的请求,浏览器应告知该请求来自站点B;

站点A的响应中,应明确哪些跨域请求是被允许的。

简单请求:

get / post / head 方法之一;

仅能使用cors安全的头部:Accept / Accept-Language / Content-Language / Content-Type (这些头部为内容协商式的头部,可以设置 Forbidden header name 中的头部字段,如 Connection 、Accept-Encoding等,但是设置无效,设置其他头部则为复杂请求)

Content-Type值(访问的媒体类型)只能是:text/plain,multipart/form-data,application/x-www-form-urlencoded三者其中之一(除此之外的请求都为复杂请求,复杂请求和简单请求的跨域是完全不同的)

简单请求之外的复杂请求

访问资源前,需要先发起prefight预检请求(方法为options)询问何种请求是被允许的

简单请求的跨域访问

请求头中携带origin头部告知来自哪个域

响应中携带Access-Control-Allow-Origin头部表示允许哪些域

浏览器放行

通过Origin来告诉来自哪个域(在此处来自于Server-b),发送给Serve=>Serve回一个Access-Control-Allow-Origin允许哪些域进行访问

其实限制能不能进行同源访问全部在于Client,Serve不做任何限制的,即使不传入头部Serve也不会有问题的,也是会进行响应的,也就是说浏览器一定接收到了响应,但是如果Access-Control-Allow-Origin中指定的域名不是当前页面所匹配的域名的话,浏览器就不会去渲染相应的请求   

复杂请求的跨域访问

复杂请求进行跨域请求的时候需要进行两步

第一步:Client => Server 预检请求

第二部:实际请求

 预检请求

  • 预检请求的头部

Access-Control-Request-Method:后面实际发送请求的方法

Access-Control-Request-Headers:接下来将要发起实际复杂请求跨域访问时会使用到哪些头部

整个预检请求的方法必须是option方法

  • 预检请求响应

Access-Control-Allow-Methods:允许哪些方法去访问站点

Access-Control-Allow-Headers:允许哪些头部在后续的请求中去访问跨域请求

Access-Control-Max-Age:允许缓存的最长时间

跨域访问资源:Http请求头部字段

  • Origin(RFC6454):一个页面的资源可能来自于多个域名,在ajax等子请求中表明来源于某个域名下的脚本,以通过服务器的安全校验。头部字段表示预检请求的源站

origin = "Origin:"OWS origin-list-or-null OWS

origin-list-or-null = %x6E %s75 %x6c %x6c / origin-list 可以表示多个域

origin-list = serialized-origin *(SP serialized-origin)

serialized-origin = scheme "://" host [":"port] 域中可以含有scheme信息和host端口

  • Access-Control-Request-Method

在preflight预检请求中,告知服务器接下来的请求会使用哪些方法

  • Access-Control-Request-Headers

在preflight预检请求中,告知服务器接下来的请求会使用哪些头部

跨域访问资源:Http响应头部字段

  • Access-Control-Allow-Methods

在preflight预检请求的响应中,告知客户端后续请求允许使用的方法

  • Access-Control-Allow-Headers

在preflight预检请求的响应中,告知客户端后续请求允许携带的头部

  • Access-Control-Max-Age

在preflight预检请求的响应中,告知客户端响应的信息可以缓存多久

  • Access-Control-Expose-Headers

告知浏览器哪些响应头部可以共客户端使用,默认情况下只有Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,pragma可供使用。

  • Access-Control-Allow-Origin

告知浏览器允许哪些域访问当前资源,*表示允许所有域。为避免响应错乱,响应中需要携带Vary:Origin

  • Access-Control-Credentials

告知浏览器是否可以将Credentials暴露给客户端使用,Credentials包含cokkie、authorization类头部、TLS证书等。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值