最近在用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