首页 > 其他分享 >options请求(跨域预检)

options请求(跨域预检)

时间:2023-01-29 12:01:08浏览次数:36  
标签:浏览器 请求 预检 options OPTIONS 跨域

 

原文链接:https://blog.csdn.net/weixin_43822787/article/details/121036722

 

概述
options 请求就是预检请求,可用于检测服务器允许的 http 方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起 OPTIONS 请求,

即 CORS 预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。

 

一、什么是 options 请求
HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为"*")使用该方法。

(简而言之,就是可以用 options 请求去嗅探某个请求在对应的服务器中都支持哪种请求方法)。

 

原因

这是因为在跨域的情况下,在浏览器发起"复杂请求"时主动发起的。跨域共享标准规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的

HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求

。服务器确认允许之后,才发起实际的 HTTP 请求。

 

二、简单请求和复杂请求
某些请求不会触发CORS预检请求,这样的请求一般称为 “简单请求” ,而会触发预检的请求则是 “复杂请求” 。

简单请求
请求方式为GET、HEAD、POST时的请求;
认为设置规范集合之内的首部字段,如Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width;
Content-Type 的值仅限于下列三者之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain;
请求中的任意 XMLHttpRequestUpload对象均没有注册任何事件监听器;
请求中没有使用 ReadableStream对象。
复杂请求
PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH;
人为设置了以下集合之外首部字段,即简单请求外的字段;
Content-Type 的值不属于下列之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain。


三、option关键字段
request header 的关键字段

 

 

response header 的关键字段

 

 

三、Options 请求优化
当发起跨域请求时,简单请求只发起一次请求;复杂请求则需要2次,先发起options请求,确认目标资源是否支持跨域,浏览器会根据服务端响应的header自动处理剩余的请求,如果响应支持跨域,

则继续发出正常请求;不支持的话,会在控制台显示错误。所以,当触发预检时,跨域请求便会发送2次请求,增加请求次数,同时,也延迟了请求真正发起的时间,会严重地影响性能。

 

优化options请求的两种方法:
方法一: 用其它的跨域方式做跨域请求,将复杂请求转为简单请求,比如JSONP等;
方法二: 对 options 请求进行缓存。
服务器端设置 Access-Control-Max-Age 字段,那么当第一次请求该 URL 时会发出 OPTIONS 请求,浏览器会根据返回的 Access-Control-Max-Age 字段缓存该请求的 OPTIONS 预检请求的响应结果

(具体缓存时间还取决于浏览器的支持的默认最大值,取两者最小值,一般为 10 分钟)。在缓存有效期内,该资源的请求(URL 和 header 字段都相同的情况下)不会再触发预检。(chrome 打开控制台

可以看到,当服务器响应 Access-Control-Max-Age 时只有第一次请求会有预检,后面不会了。注意要开启缓存,去掉 disable cache 勾选。)

 

标签:浏览器,请求,预检,options,OPTIONS,跨域
From: https://www.cnblogs.com/kelelipeng/p/17072311.html

相关文章

  • 后端跨域问题导致java.io.IOException: UT010029: Stream is closed解决办法
    转载自:https://blog.csdn.net/qq_45925197/article/details/126708024背景下载文件压缩成zip包接口,postman自测没问题,但在和前端联调的时候前端就会出现如下跨域的报错......
  • vue配置反向代理解决跨域__Vue.js
    正向代理与反向代理正向代理:在客户端和原始服务器(originserver)之间架设一个代理服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后......
  • ajax跨域访问的问题解决
    在web项目中经常用到在ajax中进行跨域访问,比如在a域中访问b域中的服务,却实现不了。原因是:浏览器为了保证服务器数据的安全,对于这种请求,所给予的权限是较低的,通常只允许调用......
  • Vue3 proxy 解决跨域
    1.首先我们先了解一下什么是跨域主要是出于浏览器的同源策略限制,它是浏览器最核心也最基本的安全功能。当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不......
  • 后端解决跨域问题
    过滤器:packagecom.shenke.filter;importjava.io.IOException;importjavax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.htt......
  • spring boot——请求与参数校验——重要概念——配置CORS实现跨域——华章
                              CorsConfig packageorg.example.cors.config;importorg.springframework.con......
  • Bash: options
     bash[options][command_string|file]-cIfthen-coptionispresent,thencommandsarereadfromthefirstnon-optionargumentcommand_string.Ifthere......
  • JavaScript 跨域问题
    一、什么是跨域跨域(Cross-originresourcesharing,CORS)是指在浏览器中,同源策略限制了来自不同域的脚本对每个网络资源的访问权限。同源策略限制了一个网页脚本只能......
  • springboot允许跨域访问
    前后端开发学习中,vue里面需要跨域访问后台数据可在springboot后台里面添加个配置类即可:packagecom.springboottest.config;importorg.springframework.beans.factor......
  • 小满Vue3第四十六章(Proxy跨域)
    1.首先我们先了解一下什么是跨域主要是出于浏览器的同源策略限制,它是浏览器最核心也最基本的安全功能。当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不......