什么是options请求,简单的说就是可以用 options 请求去嗅探某个请求在对应的服务器中都支持哪种请求方法。
一般我们不会自己手动的去触发options请求,一般都是浏览器自动去完成处理的。当产生一些跨域的情况下,发起复杂请求时,对那些可能对数据库数据产生副作用的请求时。浏览器会首先发送一个options请求,得到服务端许可的后才会发送真实的请求。
简单请求
简单请求不会触发options预请求,简单请求:
- 请求方式为GET、POST、HEAD
- Content-type的值为application/x-www-form-urlencoded、multipart/form-data、text/plain三个中的某一个
- 人为设置了规范集合之内的请求头字段,如Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width
复杂请求
- 使用除开简单请求方式外的请求
- 设置了非规定的集合之内的请求头字段,比如经常自定义了token、user等
- Content-type的值不属于application/x-www-form-urlencoded、multipart/form-data、text/plain
options请求头关键字段
Access-Control-Request-Method: POST // 通知服务器,真实请求将采用POST
Access-Control-Request-Header: token, Content-type // 通知服务器,真实请求携带的自定义头部字段
options返回头关键字段
Access-Control-Allow-Methods 服务器运行客户端使用什么请求方式
Access-Control-Allow-Origin 允许跨域的域名,允许所以跨域这个只为*
Access-Control-Max-Age 预请求能够缓存多久
Access-Control-Request-Headers 将实际请求所携带的首部字段告诉服务器
options优化
如果所有接口都使用options请求,会增加请求次数,延迟真实请求发起时间,影响性能
- 把一些不要的复杂请求转为简单请求
- 设置options缓存 Access-Control-Max-Age 字段
小结
options请求就是一个预请求,可用于检测服务器允许的 http 方法。为了安全浏览器会发起options(CORS)预检请求,服务器同意后,客户端才发送真实请求
网友评论