OPTIONS 请求
在项目中,前端通过 POST 方式访问后端 REST 接口时,会看到两条请求记录:一条 Request Method 为 OPTIONS,另一条为 POST。OPTIONS 请求方法的主要用途有两个:
- 获取服务器支持的 HTTP 请求方法。
- 检查服务器性能。
一、预检请求(Preflight)
CORS 中一种透明的服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求,目的是判断实际发送的请求是否安全。
需要预检的两种情况:
- 非简单请求,比如
Content-Type为application/xml或text/xml的 POST 请求。 - 设置了自定义头,比如
X-JSON、X-MENGXIANHUI等。
OPTIONS 方法用于请求获得 Request-URI 标识的资源在请求/响应通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前决定对该资源采取何种必要措施,或者了解服务器的性能。该请求方法的响应不能缓存。
200 响应:预检请求不会携带 cookie,正式请求会携带 cookie 和参数。一旦服务器通过预检请求,后续 CORS 请求就跟简单请求一样。
二、两种请求方式
浏览器将 CORS 请求分为两类:简单请求(simple request)和非简单请求(not-simple-request)。简单请求不预检,非简单请求会预检。
简单请求必须同时满足以下三大条件
- 请求方式只能是:
GET、POST、HEAD。 - HTTP 请求头只能包含这些字段:
Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID。 Content-Type只能是:application/x-www-form-urlencoded、multipart/form-data、text/plain。
不满足其中任何一条即为非简单请求。
三、CORS 响应头字段
请求头 origin 字段说明请求来自哪个源(协议+域名+端口)。服务器据此决定是否同意该请求,响应头会多出几个 Access-Control-* 字段:
Access-Control-Allow-Origin:必需。*表示接受任意域的请求,也可指定具体域名。Access-Control-Allow-Credentials:可选,布尔值。表示是否可以携带 cookie。注意:若Access-Control-Allow-Origin为*,则该字段设为true无效。Access-Control-Allow-Headers:可选。可以列出Cache-Control、Content-Type、Expires等,需要其他字段时在这里显式指定。
四、非简单请求
对服务器有特殊要求的请求,比如 PUT / DELETE,或 Content-Type 为 application/json,都会在正式通信前增加一次 HTTP 请求(预检)。浏览器先询问服务器当前域名是否在许可名单中,服务器允许后才发出正式 XMLHttpRequest 请求,否则报错。
Java 后端可实现拦截器排除 OPTIONS 请求,避免预检失败。
来源整理自:我的有道云笔记



