预检请求OPTIONS

最近在项目偶然发现使用第三方文件管理系统上传文件时,上传请求会发送两次。发现第一个是预检请求OPTIONS
在这里插入图片描述

老早就知道HTTP请求方法有OPTIONS,但从来没使用过,一时引起了兴趣,遂查阅了相关资料。

什么是OPTIONS请求

OPTIONS请求也被称为预检请求,主要用于获知服务端支持的HTTP请求方法。跨域资源共享(CORS)标准新增了一组 HTTP 首部字段,配合预检请求可获知服务器允许哪些源站通过浏览器有权限访问哪些资源。

请求头

OPTIONS的请求头中主要有几个关键字段:Access-Control-Request-MethodAccess-Control-Request-HeadersOrigin

请求头字段作用
Access-Control-Request-Method告知服务器实际请求所使用的HTTP方法
Access-Control-Request-Headers告知服务器实际请求所携带的自定义首部字段
Origin发起请求的源站

在本次请求中,实际采用的post请求,自定义头部字段有uthorization,login-type,x-requested-with,如下图所示:
在这里插入图片描述

响应头

OPTIONS的响应头中比较重要的有五个字段:Access-Control-Allow-MethodsAccess-Control-Allow-CredentialsAccess-Control-Allow-OriginAccess-Control-Request-HeadersAccess-Control-Request-Headers

响应头字段作用
Access-Control-Allow-Methods服务端允许的请求方法,包括GET/HEAD/PUT/PATCH/POST/DELETE
Access-Control-Allow-Credentials允许跨域携带cookie(跨域请求时XMLHttpRequest.withCredentialstrue,预检时响应头该字段必须设置为true,才能携带cookie
Access-Control-Allow-Origin允许跨域请求的域名,自行在服务端配置一些信任的域名白名单
Access-Control-Request-Headers客户端请求所携带的自定义首部字段content-type
Access-Control-Max-Age本次预检请求的有效期,单位为秒,在此期间不用发出另一条预检请求。可用于优化

在本次请求中,其响应头如下:
在这里插入图片描述

预检请求的自动发起

除主动发起预检请求外,在跨域请求时经常会遇到自动发起预检请求。实际上在MDNCORS功能描述中有这样写到:

规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。

当发生以下情况时,客户端就会自动发起OPTIONS预检请求

  1. 使用以下任一HTTP 方法:PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH
  2. 设置了以下头部字段以外的自定义字段:Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width
  3. Content-Type 的值不属于下列之一: application/x-www-form-urlencodedmultipart/form-datatext/plain
  4. 请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。
  5. 请求中没有使用 ReadableStream 对象

按照上面的规则,因为本次实际请求设置了自定义字段故触发了预检请求。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值