Javaweb————什么是OPTIONS预检请求
🍕🍕🍕前面我们已经介绍过HTTP请求的九种方式,这篇文章就来着重介绍一下九种方式中的OPTIONS预检请求,这个请求在跨域资源请求中发挥着重要作用
🏍️🏍️🏍️什么是 OPTIONS 预检请求?
预检请求是浏览器在发送某些跨域请求之前,会发送一个 OPTIONS 请求,目的是为了确认服务器是否允许该跨域请求。
🏍️🏍️🏍️什么情况下会触发预检请求?
❤️❤️❤️1. 发送非简单请求时
简单请求包括 GET、HEAD、POST,因此,当发送除了这三个方法之外的请求时,例如 PUT、DELETE、PATCH,浏览器会先发送一个 OPTIONS 请求,询问服务器是否允许该请求。
❤️❤️❤️2. Content-Type 为 application/json 时
当 Content-Type为 application/json 时也会触发预检请求, 而值为 application/x-www-form-urlencoded、multipart/form-data、text/plain时则不会触发预检请求。
❤️❤️❤️3. 当存在自定义请求头时
当请求头中存在自定义请求头时或者在标准请求头中设置非标准内容时,也会触发预检请求。
OPTIONS 预检请求流程
OPTIONS 请求会包含一下头部信息:
Origin:请求来源的域名
Access-Control-Request-Method: 实际请求所使用的 HTTP 方法
Access-Control-Request-Headers:实际请求所携带的自定义请求头
服务器需要在响应头中返回一些 CORS 相关的头部信息,例如:
Access-Control-Allow-Origin:允许跨域请求的域名
Access-Control-Allow-Methods:允许跨域请求的方法
Access-Control-Allow-Headers:允许跨域请求的自定义请求头
下图是京东商城的首页的某个服务,可以看出允许跨域请求的域名是所有(*号),还可以看到允许的自定义请求头以及允许跨域请求的方法是GET,POST和OPTIONS
注意并不是所有跨域请求的域名都是*号,有的网址只指定了特定的域名可以进行跨域请求
如果 HTTP 请求满足服务器返回的响应头中的信息, 即服务器允许当前请求的跨域访问,那么浏览器才会发送实际的 HTTP 请求。否则,浏览器会拒绝该请求,并在控制台中输出报错信息。
🏍️🏍️🏍️预检请求的缓存
预检请求并不会每次都发生,是因为浏览器会对预检请求进行缓存,服务器通过设置 Access-Control-Max-Age 来指定预检请求的缓存时间。
如果设置为 86400,指 24 小时内不再预检。
如果设置为 -1,则表示不缓存,每次请求前都会发送预检请求。