http中的post请求发⽣了两次(多了⼀次options请求)的原因

两次请求⼀般:第⼀条为options请求,第⼆条请求才是我们预想中的请求。为什么先发起了⼀条options请求:
options请求
options请求的官⽅定义:OPTIONS⽅法是⽤于请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使⽤的功能选项。通过这
个⽅法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。
其实就是:在发⽣正式的请求之前,先进⾏⼀次预检请求。看服务端返回⼀些信息,浏览器拿到之后,看后台是否允许进⾏访问。

如何产⽣options请求:
产⽣options请求的原因包括以下⼏条:
1:产⽣了复杂请求。复杂请求对应的就是简单请求。简单请求的定义是:
请求⽅法是GET、HEAD或者POST,并且当请求⽅法是POST时,Content-Type必须是application/x-www-form-urlencoded,
multipart/form-data或着text/plain中的⼀个值。
请求中没有⾃定义HTTP头部。
所谓的⾃定义头部,在实际的项⽬⾥,我们经常会遇到需要在header头部加上⼀些token或者其他的⽤户信息,⽤来做⽤户信息的校验。

2:发⽣了跨域
options请求有什么作⽤
官⽅将头部带⾃定义信息的请求⽅式称为带预检(preflighted)的跨域请求。在实际调⽤接⼝之前,会⾸先发出⼀个options请求,检测服务端是否⽀持真实的请求进⾏跨域的请求。真实请求在options请求中,通过request-header将 Access-Control-Request-HeadersAccess-Control-Request-Method发送给后台,另外浏览器会⾃⾏加上⼀个Origin请求地址。服务端在接收到预检请求后,根据资源权限配置,在response-header头部加⼊access-control-allow-headers(允许跨域请求的请求头)、access-control-allow-methods(允许跨域请求的请求⽅式)、access-control-allow-origin(允许跨域请求的域)。另外,服务端还可以通过Access-Control-Max-Age来设置⼀定时间内⽆须再进⾏预检请求,直接⽤之前的预检请求的协商结果即可。浏览器再根据服务端返回的信息,进⾏决定是否再进⾏真实的跨域请求。这个过程对于⽤户来说,也是透明的。

另外在HTTP响应头,凡是浏览器请求中携带了⾝份信息,⽽响应头中没有返回Access-Control-Allow-Credentials: true的,浏览器都会忽略
此次响应。

总结:只要是带⾃定义header的跨域请求,在发送真实请求前都会先发送OPTIONS请求,浏览器根据OPTIONS请求返回的结果来决定是否
继续发送真实的请求进⾏跨域资源访问。所以复杂请求肯定会两次请求服务端。

options请求如何避免
其实通过以上的分析,我们能得出以下解决⽅案:
1:使⽤代理,避开跨域。
2:将复杂跨域请求更改为简单跨域请求。
3:不使⽤带⾃定义配置的header头部。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值