Options请求

options触发条件
跨域且请求时非简单请求(不满足简单请求条件)
- 发送跨域请求时,请求头中包含了一些非简单请求的头信息,例如自定义头(custom header)等;
- 发送跨域请求时,使用了 PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH等请求方法。
简单请求
简单请求要满足两个条件:
请求方法为:
HEAD、GET、POSTheader中只能包含以下请求头字段:
AcceptAccept-LanguageContent-LanguageContent-Type: 所指的媒体类型值仅仅限于下列三者之一
text/plainmultipart/form-dataapplication/x-www-form-urlencoded
为什么有options请求
发出非简单cors请求,浏览器会做一个http的查询请求(预检请求)也就是options。options请求会按照简单请求来处理。那么为什么会做一次options请求呢?
检查服务器是否支持跨域请求,并且确认实际请求的安全性。预检请求的目的是为了保护客户端的安全,防止不受信任的网站利用用户的浏览器向其他网站发送恶意请求。 预检请求头中除了携带了origin字段还包含了两个特殊字段:
Access-Control-Request-Method: 告知服务器实际请求使用的HTTP方法Access-Control-Request-Headers:告知服务器实际请求所携带的自定义首部字段。 比如:
如何去掉或者减少option请求
由于预检请求(options请求)的存在是为了保护客户端的安全,防止不受信任的网站利用用户的浏览器向其他网站发送恶意请求,因此不能完全去掉options请求。但是可以通过以下方式来减少options请求的次数:
- 确保请求头部信息不超出简单请求所规定的字段范围;
- 如果Content-Type的值不属于以下几种:application/x-www-form-urlencoded、multipart/form-data、text/plain,则改为使用其中一种;
- 将请求方法改为GET或POST中的一种;
- 使用跨域资源共享(CORS)中的其他方式(如设置Access-Control-Max-Age)来缓存预检请求的结果,减少options请求的次数。