ajax跨域的非简单请求,ajax跨域问题(四)

被调用方-Filter解决方案

在响应头增加字段,告诉浏览器我允许对方跨域调用。所以我们可以在filter上增加相应头

浏览器是先执行还是先判断?

浏览器在发出请求的时候会先判断请求是简单请求还是非简单请求。如果是简单请求它就会先执行后判断,如果是非简单请求他就会先发一个预检命令,检查通过之后他才会把跨域请求发出去。

浏览器如何判断?

我们可以通过对比普通请求和跨域请求请求头里面的区别,对比之后发现跨域请求的请求头里面多了一个orgin字段。这个字段的值是当前域名的信息。浏览器发现这个请求是跨域请求的时候,它就会在请求头里面增加一个当前域的信息的字段。然后等请求返回回来的时候,他就会检查下响应头里面有没有允许跨域的信息如果没有他就会报错。

filter代码实现

bVbrBdb?w=723&h=271

简单请求和非简单请求:

1、简单请求:

方法为GET、HEAD、POST的请求,并且请求头(header)里面没有自定义头;Content-Type为text/plain、multipart/form-data、application/x-www-form-urlencoded。

2、非简单请求:

方法为PUT、DELETE的请求,发送JSON格式的ajax请求、带自定义请求头的ajax请求。

例子:发送JSON格式的ajax请求

bVbrBdW?w=382&h=353

Access-Control-Allow-Headers是什么?有什么作用?

响应头部 Access-Control-Allow-Headers 用于 preflight request (预检请求)中,列出了将会在正式请求的 Access-Control-Expose-Headers 字段中出现的首部信息。简单首部,如 simple headers、Accept、Accept-Language、Content-Language、Content-Type (只限于解析后的值为 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 三种MIME类型(不包括参数)),它们始终是被支持的,不需要在这个首部特意列出。

Access-Control-Max-Age是什么?

浏览器的同源策略,就是出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求(比如异步请求GET, POST, PUT, DELETE, OPTIONS等等),所以浏览器会向所请求的服务器发起两次请求,第一次是浏览器使用OPTIONS方法发起一个预检请求,第二次才是真正的异步请求,第一次的预检请求获知服务器是否允许该跨域请求:如果允许,才发起第二次真实的请求;如果不允许,则拦截第二次请求。Access-Control-Max-Age用来指定本次预检请求的有效期,单位为秒,,在此期间不用发出另一条预检请求。

例如:res.addHeader("Access-Control-Max-Age", "3600"),表示隔60分钟才发起预检请求

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值