-
options请求
2018-12-18 17:27:37在当前项目中,前端通过POST方式访问后端的REST接口时,发现两条请求记录,一条请求的Request Method为Options,另一条请求的Reuest Method为Post。想要解决这个疑惑还得从以下3个概念说起。 Http Options Method ...<1>
一个Option请求引发的深度解析
在当前项目中,前端通过POST方式访问后端的REST接口时,发现两条请求记录,一条请求的Request Method为Options,另一条请求的Reuest Method为Post。想要解决这个疑惑还得从以下3个概念说起。
Http Options Method
RFC2616标准(现行的HTTP/1.1)中如下描述:
简而言之,OPTIONS请求方法的主要用途有两个:
1、获取服务器支持的HTTP请求方法;
2、用来检查服务器的性能。
CORS(跨域资源共享)
CORS是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。
使用CORS的方式非常简单,但是需要同时对前端和服务器端做相应处理。
1、 前端
客户端使用XmlHttpRequest发起Ajax请求,当前绝大部分浏览器已经支持CORS方式,且主流浏览器均提供了对跨域资源共享的支持。
2、 服务器端
如果服务器端未做任何配置,则前端发起Ajax请求后,会得到CORS Access Deny,即跨域访问被拒绝。
对于C#做如下配置可允许资源的跨域访问:
<system.webServer>
...
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type" />
<add name="Access-Control-Allow-Methods" value="PUT,GET,POST,DELETE,OPTIONS"/>
</customHeaders>
</httpProtocol>
</system.webServer>对于nodejs做如下配置可允许资源的跨域访问:
//设置CORS跨域访问
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With, accept, origin, content-type");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});Access-Control-Allow-Origin:*表示允许任何域发起请求,如果只允许特定的域访问,则设置Access-Control-Allow-Origin:xxx为具体域名即可。
Preflighted Requests(预检请求)
Preflighted Requests是CORS中一种透明服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。
下面的2种情况需要进行预检:
1、 简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的 POST 请求;
2、中设置自定义头,比如 X-JSON、X-MENGXIANHUI 等。
了解完这3个概念,其实答案已经了然了。
参考:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
http://blog.csdn.net/hfahe/article/details/7730944
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
<2>
HTTP请求方法并不是只有GET和POST,只是最常用的。据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。
HTTP请求方法并不是只有GET和POST,只是最常用的。据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。
官方定义
OPTIONS方法是用于请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。
该请求方法的响应不能缓存。
如果这个OPTIONS请求包含一个正文(有Content-Length或Transfer-Encoding存在),则必须有Content-Type来指定媒体类型。虽然规范里没有定义这种正文的用法,但是HTTP将来的扩展可能会用它来查询服务器上更详细的信息。不支持该扩展的服务器可以忽略该请求正文。
如果该URI是一个星号(“*”),OPTIONS请求将试图应用于服务器,而不是某个指定资源。由于服务器的通信选项通常依赖于资源,所以此“*”请求只能作为“ping”或者“no-op”方法;或者用来测试服务器的性能。例如,用来测试HTTP/1.1代理。
如果该URI不是星号,则只能用来获取该资源通信中可用的选项。
得到的200响应应该包含一个头域,指明服务器实现的和适用于该资源的可选特征(如:Allow),可能还包括该规范尚未定义的扩展。如果有响应正文,则应包含关于通信选项的信息。本规范没有定义该正文格式,但可能在HTTO将来的扩展中定义。可以利用内容协商来选择合适的响应格式。如果没有响应正文,响应必须包含Content-Length,并且值为“0”。
请求头的Max-Forwards用来请求特定代理。当代理收到一个允许URI转发的OPTIONS请求,则检查Max-Forwards。如果Max-Forwards值为0,则不能转发该消息;相反,代理会将自己的通信选项去响应。如果Max-Forwards是正整数,代理转发请求的时候会将该值减1。如果请求中没有Max-Forwards,转发的请求也不会有。简而言之
OPTIONS请求方法的主要用途有两个:
1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。
2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。
The DELETE Method
HTTP提供了一个与PUT方法对应的DELETE方法。一个DELETE请求将需要从Web服务器删除的内容指定为请求行中的资源部分。
DELETE方法唯一有趣的地方在于当你接收了一个标识为200 OK的响应的时候,那并不意味着指定的资源已经被删除了。那仅仅说明服务器接收到了删除资源的命令。这一例外允许了出于安全考虑的人为的干预转自:http://blog.csdn.net/leikezhu1981/article/details/7402272
<3>
出于安全考虑,并不是所有域名访问后端服务都可以。其实在正式跨域之前,浏览器会根据需要发起一次预检(也就是option请求),用来让服务端返回允许的方法(如get、post),被跨域访问的Origin(来源或者域),还有是否需要Credentials(认证信息)等。那么浏览器在什么情况下能预检呢?
二、两种请求方式
浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-simple-request),简单请求浏览器不会预检,而非简单请求会预检。这两种方式怎么区分?
同时满足下列三大条件,就属于简单请求,否则属于非简单请求
1.请求方式只能是:GET、POST、HEAD
2.HTTP请求头限制这几种字段:Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID
3.Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain
对于简单请求,浏览器直接请求,会在请求头信息中,增加一个origin字段,来说明本次请求来自哪个源(协议+域名+端口)。服务器根据这个值,来决定是否同意该请求,服务器返回的响应会多几个头信息字段,如图所示:上面的头信息中,三个与CORS请求相关,都是以Access-Control-开头。
1.Access-Control-Allow-Origin:该字段是必须的,* 表示接受任意域名的请求,还可以指定域名
2.Access-Control-Allow-Credentials:该字段可选,是个布尔值,表示是否可以携带cookie,(注意:如果Access-Control-Allow-Origin字段设置*,此字段设为true无效)
3.Access-Control-Allow-Headers:该字段可选,里面可以获取Cache-Control、Content-Type、Expires等,如果想要拿到其他字段,就可以在这个字段中指定。比如图中指定的GUAZISSO
非简单请求是对那种对服务器有特殊要求的请求,比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。都会在正式通信之前,增加一次HTTP请求,称之为预检。浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,服务器允许之后,浏览器会发出正式的XMLHttpRequest请求,否则会报错。(备注:之前碰到预检请求后端没有通过,就不会发正式请求,然后找了好久原因,原来后端给忘了设置...)Java后端实现拦截器,排除Options
JAVA代码片段
就Content-Type为application/json为例:对比两张图片,一次预检请求,一 次正式请求:
预检请求
正式请求
很明显,请求头中预检请求不会携带cookie,正式请求会携带cookie和参数。跟普通请求一样,响应头也会增加同样字段。
一旦服务器通过了“预检”请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样。
-
解决:use options instead of chrome_options
2020-04-06 08:15:36解决:use options instead of chrome_options使用 selenium可以调用 谷歌、火狐等浏览器进行爬虫的爬取,比如这段代码出现use options instead of chrome_options:解决方法: 使用 selenium可以调用 谷歌、火狐等...使用 selenium可以调用 谷歌、火狐等浏览器进行爬虫的爬取,比如这段代码出现use options instead of chrome_options:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') base_url = "http://www.baidu.com/" driver = webdriver.Chrome(chrome_options = chrome_options) driver.get(base_url + "/") driver.find_element_by_id("kw").send_keys("Python程序设计") driver.find_element_by_id("su").click() driver.save_screenshot('screen.png') driver.close()
DeprecationWarning: use options instead of chrome_options
解决方法:
chrome_options参数是已经弃用的,被新的参数options替换了
将 chrome_options 替换为 options 即可。
修改第七行:from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') base_url = "http://www.baidu.com/" driver = webdriver.Chrome(options = chrome_options) driver.get(base_url + "/") driver.find_element_by_id("kw").send_keys("Python程序设计") driver.find_element_by_id("su").click() driver.save_screenshot('screen.png') driver.close()
运行结果:
-
Ajax 请求中出现OPTIONS(Request Method: OPTIONS)
2019-09-03 10:15:49做上传文件功能时,在请求上传文件接口之前,会发送一个options的请求。 原因 ajax 请求遵循同源策略(协议、域名、端口必须一致),若突破该限制,会产生跨域行为,设置Access-Control-Allow-Origin: *,可允许...背景
做上传文件功能时,在请求上传文件接口之前,会发送一个options的请求。
原因
ajax 请求遵循同源策略(协议、域名、端口必须一致),若突破该限制,会产生跨域行为,设置Access-Control-Allow-Origin: *,可允许客户端跨域访问。
除上述情况外,还有一种请求叫做Preflighted Request(带预检的跨域请求)。Preflighted Request在发送真正的请求前,会先发送一个方法为OPTIONS的预请求(Preflighted Request),用于试探服务端是否能接受真正的请求。如果options获得的回应时拒绝性质的,如404、403、500等状态,就会停止post、get请求的发出。
请求变成Preflighted Request的情况如下:文档地址:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#The_HTTP_request_headers)
1、请求方法不是GET/HEAD/POST
2、POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
3、请求设置了自定义的header字段例如:如果POST请求要传输的数据为 XML文档, Content-Type为application/xml或text/xml, 则发送这个请求前会发送一个预请求,或者自定义的header字段也是一样的道理。
所以说, 在项目中ajax对后台API的调用, OPTIONS请求是没办法去掉的, 除非后台接口不再需要在请求header中设置openId
但是由于该项目中用户信息是采用的JWT的方式,所以只好作罢。但是由于该项目在后台中自定义了请求频率限制的拦截器,例如限制同一个客户端一秒内对某一个接口只能访问1次。如果超过限制,则第二次会返回状态码500,不予处理。如果每次请求前都带着一次OPTIONS请求,则该拦截器无法正常实现功能,反正会导致大批接口调用失败的情况。
鉴于上述分析,既然前端发起请求时OPTIONS请求没有办法去除,那么是否可以考虑从后台拦截器进行改造。
如果拦截到的请求不是项目中常规的GET或者POST请求,则该拦截器直接放行。至此,问题完美解决。希望可以帮到有类似问题的小伙伴~
-
DeprecationWarning: use options instead of chrome_options
2019-08-11 03:32:58我们只需要chrome_options改成options即可,该问题应该在最近的版本更改的目前我这边使用的是selenium==3.9.0,有兴趣的可以去看下官方文档,那个版本开始做的此项的修改。 ...我们只需要chrome_options改成options即可,该问题应该在最近的版本更改的目前我这边使用的是selenium==3.9.0,有兴趣的可以去看下官方文档,那个版本开始做的此项的修改。
-
javascript中的options.add() options.remove() options(index)或options.item(index)
2016-08-06 20:14:58javascript操作Select标记中options集合 分类:JAVASCRIPT先来看看options集合的这几个方法: options.add(option)方法向集合里添加一项option对象; options.remove(index)方法移除options集合中的指定项; ... -
DeprecationWarning: use options instead of chrome_options 问题的解决
2019-11-28 21:27:55使用 selenium可以调用 谷歌、火狐等浏览器进行爬虫的爬取,但当我运行: ...from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') dri... -
OPTIONS方法禁用
2019-03-13 11:18:27在给系统做安全检测的过程中,发现了一个低危安全性问题,检测到目标服务器启用了OPTIONS方法。 OPTIONS方法是用于请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户 ... -
IPv4 Options
2014-06-30 15:00:36IPv4 allows up to 40 bytes of options to follow the fixed 20-byte header. Although 10 different options are defined, the most commonly used is the source route option. Access to these options is thro -
options请求方式
2019-08-16 16:08:40OPTIONS请求即预检请求,可用于检测服务器...当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起OPTIONS请求,即CORS预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。 ... -
http预请求options
2018-08-10 14:49:44在有很多情况下,当我们在js里面调用一次ajax请求时,在浏览器那边却会查询到两次请求,第一次的Request Method参数是OPTIONS,还有一次就是我们真正的请求,比如get或是post请求方式 查阅相关的资料之后发现,这是浏览器... -
Ceres的Options详解
2018-12-08 15:38:49目录1、Ceres简介2、常用通用参数 1、Ceres简介 Ceres是一个非常优秀的非线性优化库(谷歌出品)。能完成很复杂的优化功能,...检查options是否合法,不合法的话返回false,并将错误信息存到error里面。 i... -
webpack Dev Server Invalid Options options should NOT have additional prop
2020-02-11 20:36:04今日npm run serve时提示ERROR ValidationError: webpack Dev Server Invalid Options options should NOT have additional properties 无效参数配置? 如图: 看提示好像是说 webpack 的dev server配置有点问题 ,... -
odoo有关options
2018-12-20 08:48:56Options : Other possible options you can use with this widget. no_quick_create - It will remove Create and edit… option. no_create_edit - It will remove Create “entered text”... -
Options用法
2014-09-02 09:49:52SIP方法OPTIONS允许一个UA来查询另外一个UA或者proxy服务器的能力。这个提供个客户端一个手段来查询服务端支持的方法,内容类型,扩展,codecs等等。这些都不用”ringing”对方。比如,在客户端试图在INVITE请求头中... -
什么是options请求?为什么会有options请求?
2019-09-05 11:07:43关于options请求的一点理解 最近最项目改造,对所有的ajax请求统一做了一点处理,发现原来很正经的ajax请求突然不正常了,每个ajax之前都多了一个相应的method为options的请求。虽然之前知道ajax的请求中method有这... -
前端OPTIONS请求
2018-06-13 10:36:34OPTIONS请求OPTIONS请求方法的主要用途有两个:1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个... -
关于options请求
2018-10-31 15:51:00有时我们在浏览器中发现发送的ajax请求自动请求两次,第一次是options请求,第二次才是你自己发送的get或post请求。 有时我们也会发现,自己用的get或者post方法请求的,浏览器只有一个options请求。自己的get或post... -
AJAX请求 OPTIONS
2018-04-19 10:49:57昨天做静态页面调用接口(java提供)的时候,ajax post 请求无论如何都加载不到数据,不是405就是415,一开始只看了Internal里返回的数据,请求类型莫名变为options,后来看了console里的内容才知道是跨域导致的。... -
IDEA vmoptions配置
2018-11-07 11:24:22打开 IDEA 安装目录,看到有一个 bin 目录,其中有两个 vmoptions 文件,需针对不同的JDK进行配置: 32 位:idea.exe.vmoptions 64 位:idea64.exe.vmoptions [plain] view plain copy... -
对‘boost::program_options::options_description::add_options()’未定义的引用
2019-06-09 16:11:05对‘boost::program_options::options_description::add_options()’未定义的引用 编译caffe、opencv、cpp文件遇到的问题 错误信息 // An highlighted block .build_release/examples/ln/macc3d_pyramid_test.o:在... -
【IDEA】MAC 修改".vmoptions"导致 IDEA 无法启动 解决方案
2020-01-20 16:29:49在IDEA的“Help | Edit Custom VM Options”菜单中修改了“.vmoptions”配置,(改错了文件路径),重启多次,软件一直打不开。即便卸载重装软件,问题依然复现。 一、".vmoptions" 官方描述 Configuring JVM ... -
idea VM options参数优化
2019-08-07 23:18:10idea 如果不优化相关的配置会很卡,而且热加载也会很慢,每一次保存都在那儿等很久,于是整理很多的vm options 优化,相对默认的空空如也的文本框,舒服多了,顺畅多了,具体如下: -Xms2048m -Xmx2048m -XX:... -
Idea2019之修改Edit Custom VM Options出错
2020-01-06 16:09:07在 填错了 Help -》Edit Custom VM Options 中的参数导致无法打开 idea.exe。 参考网址:https://intellij-support.jetbrains.com/hc/en-us/articles/206544519 (英文版) 翻译如下: Idea安装时会在你指定的... -
tf.RunOptions
2019-08-31 21:04:35__init__ __init__(**kwargs) Child Classes class Experimental Properties ...DebugOptions debug_options experimental Experimental experimental inter_op_thread_pool int32 inter_op_... -
ValidationError: Invalid options object. Less Loader has been initialized using an options object
2020-06-24 21:57:55在进行 react 项目开发的时候,出现了这个错误,ValidationError: Invalid options object. Less Loader has been initialized using an options object that does not match the API schema. 如下所示:Module ... -
ionic ValidationError: Invalid options object. Sass Loader has been initialized using an options obj
2020-06-27 13:07:17ionic 项目执行命令 ionic cordova platform android 时,出现错误ValidationError: Invalid options object. Sass Loader has been initialized using an options object that does not match the API schema ... -
OPTIONS跨域问题
2019-06-04 18:19:42SpringMVC允许OPTIONS请求问题产生:解决问题: 问题产生: 最近在做一个新项目权限控制使用shiro来做,使用Token保持会话,请求时前端把Token放入Header里,在与前端调试时出现了跨域问题,我在拦截器里是这么配置... -
Idea VM options
2019-02-05 10:19:55# Custom IntelliJ IDEA VM options ##################JVM模式############################ # IDEA的JVM以Server模式启动(新生代默认使用ParNew) -server ##################内存分配##############... -
var options = options || {};
2013-11-04 09:47:21var options = options || {};这个语句是一个赋值或者初始化语句。 该语句在options已经被初始化过后options的值不变,即执行var options = options这一部分。 当options未被初始化,即typeof options = 'undefined'...
-
KKB : spring_JDBC操作数据库
-
SFM相关的三维重建
-
3datlas98.exe 快速掌握世界地理知识和地球的知识,学习和认识我们这个世界,程序员必备
-
23种JAVA设计模式
-
2021-01-19
-
LT8618SX.pdf
-
1293. 网格中的最短路径
-
pyechart数据可视化
-
20 Python核心数据类型之字典(2).mp4
-
高性能索引
-
String Game---The 14th Jilin Provincial Collegiate Programming Contest
-
【数据分析-随到随学】数据可视化
-
flutter插件调用APP页面、使用原生aar,framework库
-
单片机完全学习课程全五季套餐
-
国家注册信息安全工程师体系课程(CISP-PTE)
-
devtool 配置 {ignore}
-
JavaEE框架(Maven+SSM)全程实战开发教程(源码+讲义)
-
big sur戴尔5370 8250u UHD620 OC引导EFI.zip
-
学习springcloud知识记录。
-
电脑通电后 网卡灯不亮 怎么办 什么原因 怎么解决_亲测管用