请求时发送OPTIONS请求

最近在用uni-app开发项目时,发现一个以前没注意到的点,当我发送POST请求的时候,在NetWork能够看到在发送正式的POST请求时,会先发送一个OPTIONS请求,OPTIONS请求后才会发送真正的POST请求json

这实际上是浏览器对复杂跨域请求的一种处理方式,在真正发送请求以前,会先进行一次OPTIONS预请求,以肯定服务器响应是否正确,是否能接受真正的请求,若是在options请求以后获取到的响应是拒绝性质的,例如500等http状态,那么它就会中止第二次的真正请求的访问。后端

其实最终是由于浏览器对简单跨域请求和复杂跨域请求的处理区别跨域

XMLHttpRequest会遵照同源策略(same-origin policy). 也即脚本只能访问相同协议/相同主机名/相同端口的资源, 若是要突破这个限制, 那就是所谓的跨域, 此时须要遵照跨域资源共享标准CORS(Cross-Origin Resource Sharing)机制。浏览器

浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-simple-request)。缓存

简单请求浏览器请求不会触发预检请求,而非简单请求会触发预检请求。这两种方式怎么区分?服务器

同时知足下列如下条件,就属于简单请求,不然属于非简单请求(参考HTTP访问控制(CORS))app

1.请求方式只能是:GET、POST、HEAD

2.HTTP请求头限制这几种字段(不得人为设置该集合以外的其余首部字段):

Accept、Accept-Language、Content-Language、Content-Type(须要注意额外的限制)、DPR、Downlink、Save-Data、Viewport-Width、Width

3.Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain

4.请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可使用 XMLHttpRequest.upload 属性访问。

5.请求中没有使用 ReadableStream 对象。
非简单请求 会在正式通讯以前,增长一次HTTP请求,称之为预检请求。浏览器会先发起OPTIONS方法到服务器,以获知服务器是否容许该实际请求。

由此可知,若要咱们的请求知足简单请求就能够避免发起OPTIONS请求了。url

可是spa

一、咱们系统请求中除了GET/POST还有PUT,DELETE,不能知足.net

2,咱们系统有作业务模块权限,请求头里须要带有用户验证信息,第二点也不知足

3,咱们的Content-Type绝大多数是application/json,仍是不知足

而后只能寄但愿于减小发起OPTIONS请求的次数,也就是说仍是会用,但不是每次都用,查到的方法以下:

后端在请求的返回头部添加:

Access-Control-Max-Age:(number)  。数值表明preflight request  (预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 能够被缓存多久,单位是秒。

例如:将预检请求的结果缓存10分钟:

Access-Control-Max-Age: 600 

不一样浏览器有不一样的上限。在Firefox中,上限是24h(即86400秒),而在Chromium 中则是10min(即600秒)。Chromium 同时规定了一个默认值 5 秒。
若是值为 -1,则表示禁用缓存,每一次请求都须要提供预检请求,即用OPTIONS请求进行检测。

Access-Control-Max-Age方法对彻底同样的url的缓存设置生效,多一个参数也视为不一样url。也就是说,若是设置了10分钟的缓存,在10分钟内,全部请求第一次会产生options请求,第二次以及第二次之后就只发送真正的请求了。


转载自:https://blog.csdn.net/xiaoxiong_jiaxin/article/details/88060663

相关文章
相关标签/搜索