0%

ajax产生二次请求原因及解决方式

二次请求一般是指发送正确请求之前,额外发送了一次OPTIONS请求。

OPTIONS请求,也叫预检请求和嗅探请求,目的是为了检测要发送的真正请求是否是服务器允许的请求,如果服务器不允许,则会停止发送真正的请求。
产生OPTIONS请求的原因,首先是这个请求是跨域请求,因为只有在CORS跨域资源共享场景下,服务器http header中会有一个叫“Access-Control-Allow-Origin”的字段,该字段规定了指定的客户端来源才能对服务器资源进行访问,那么在这个来源之内的所有请求,都是CORS跨域资源共享模式,但是在这个模式下,服务器也不是完全相信客户端的,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),即非简单请求,浏览器必须首先使用 OPTIONS 方法发起一个预检请求,如果预检不通过,服务器还是会拒绝浏览器的请求。

非简单请求定义:

  1. 使用除GET、HEAD、POST方法之外的其他请求类型如PUT DELETE 等。
  2. 人为设置了下列列表之外的其他header字段:
  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type (application/x-www-form-urlencoded、multipart/form-data、text/plain之外)
  • DPR
  • Downlink
  • Save-Data
  • Viewport-Width
  • Width

若发送了非简单请求,则会产生嗅探请求。
解决方式:

  1. 可以将发送的请求改为简单请求
  2. 或者将客户端与服务端部署在同一个ip地址下或者使用请求代理让其不产生跨域
  3. 或者在服务器CORS header中的Access-Control-Allow-Methods字段中,增加对OPTIONS的支持,后者只会让所有OPTIONS请求通过,而不会去除OPTIONS请求。