技术标签: java
什么是options请求?为什么会有options请求?
首先还是看一下官方或者比较官方的定义:
HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法。 --MDN WEB DOCS
同时options请求具备以下特性:
选项 是否允许 备注
Request has body No 没有请求体
Successful response has body No 成功的响应有响应体
Safe Yes 安全
Idempotent Yes 密等性,不变性,同一个接口请求多少次都一样
Cacheable No 不能缓存
Allowed in HTML forms No 不能在表单里使用
简言之,**options请求是用于请求服务器对于某些接口等资源的支持情况的,包括各种请求方法、头部的支持情况,仅作查询使用。**来个例子,
->>> curl -X OPTIONS https://xxxx.com/micro/share/getShareRecord -i
HTTP/1.1 200 OK
Server: nginx/1.13.3
Date: Mon, 30 Jul 2018 12:50:08 GMT
Content-Length: 0
Connection: keep-alive
Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
X-Frame-Options: SAMEORIGIN
Access-Control-Allow-Origin: 0
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: X-Requested-With
通过curl来发送一个http请求,在响应头中可以发现服务器上这个接口对请求方法以及一些header的使用允许情况,也就是上面说的获取服务器对于某些资源的选项、支持情况。
而除了这些,options和其他http请求还有什么不同么?答案是有的
浏览器级行为
这个概念听着有点耳生,嗯是我自己这么说的。。。我们可以把浏览器自主发起的行为称之为“浏览器级行为”。之所以说options是一种浏览器级行为,是因为在某些情况下,普通的get或者post请求回首先自动发起一次options请求,当options请求成功返回后,真正的ajax请求才会再次发起。
再来看下这个“某些情况下”都是什么情况?
1、跨域请求,非跨域请求不会出现options请求
2、自定义请求头
3、请求头中的content-type是application/x-www-form-urlencoded,multipart/form-data,text/plain之外的格式
当满足条件12或者13的时候,简单的ajax请求就会出现options请求,有没有感觉到一点同源策略的意思,个人理解这个就是浏览器底层对于同源策略的一个具体实现。首先得到服务器端的确认,才能继续下一步的操作,这也是为什么options请求也被叫做“预检”请求的原因吧。
出现之后怎么处理?服务端怎么响应这个?
这个基本思路就是server端在接收到请求的时候,先去判断下是不是options请求,判断下来源,没问题的时候返回个200之类的成功就可以了。
OPTIONS请求即预检请求,可用于检测服务器允许的http方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起OPTIONS请求,即CORS预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。
问题背景: vue axios 向后端发送post请求,从network中看到并无post请求,只有一个options的请求,状态码200 首先,看一下为什么会有options请求 在正式跨域的请求前,浏览器会根据需要,发起一个“PreFlight”(也就是Options请求),用来让服务端返回允许的方法(如get、post),被跨域访问的Origin(来源,或者域),还有...
为什么会发送这个OPTIONS请求? 可以去掉吗? 过程 首先, 我在js代码里是没写要发送OPTIONS请求的, 后台API要的请求方法不是GET就是POST, 我只发送过这两种类型的请求. 那么, 我就以为是Zepto搞的鬼, 于是去看它的源码. Zepto的源码模块化做得很好, 直接看里面的ajax.js文件就好了. 结果, 我发现一切正常啊, 并没有这种逻辑: 发送GET/POST请求之前...
HTTP请求方法之options请求 HTTP请求 最近在做unaipp H5网页端微信公众号登录授权时由于options请求导致code值失效问题。因此要避免服务器向后端发送options请求使用code值。由于需要携带token,自己设置了HTTP的头信息从而发送了options请求。 HTTP请求 简单请求 非简单请求 如果请求字段超出如下内容,就是非简单请求。浏览器会先发options请求...
因为前后端分离出现跨域的请求,域名、端口、协议不同就是跨域 1.在django中添加接受跨域请求https://www.cnblogs.com/randomlee/p/9752705.html 在前端请求的时候加上请求头 (内容类型) 后续出现参数没有序列化的问题,难以提取数据,加入qs模块 https://www.cnblogs.com/dreamzone/p/13081082.html...
为什么80%的码农都做不了架构师?>>> post 提交数据的Content-Type 如果是 application/json的话,那么浏览器会先发送一个options请求,这个时候如果服务端不处理这个请求的话,就会执行一次对应的php代码。执行完了,再发送post请求,又执行一遍这个php代码,速度慢了一倍。 转载于:https://m...
1、背景 在前后端分离的项目中经常会遇到跨域请求的问题,如果没有进行跨域配置,会浏览器请求失败。我一般采用两种解决方案: 1、采用nginx进行转发,是前后端服务处于同一个域下面,从根本上避免跨域问题。 2、后端服务做一些配置,允许请求跨域,从而解决浏览器跨域问题。但是有时候浏览器还会发送OPTIONS请求。 2、跨域请求 跨域请求的介绍,以及处理方式可以看https://deve...
第一次遇到options请求,看了一些资料和别人的博客才有所了解 第一步,先了解了几个概念: CORS:(Cross-Origin Resource Sharing,跨域资源共享)是一个系统,它由一系列传输的HTTP头组成,这些HTTP头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。(参考MDN术语表) 同源安全策略 默认阻止“跨域”获取资源。但是 ...
此Ajax 跨域访问post 请求,但是在服务器却得到的总是options请求 (req.method==‘OPTIONS’) 不知为何啊? 原因: 因为此post请求的 content-type不是one of the “application/x-www-form-urlencoded, multipart/form-data, or text/plain&...
最近做了一个前后端分离的项目,后台用的.NET MVC写的接口,前台用的VUE。出现了一个问题,就是在后台获取Header Token的时候,怎么也获取不到,后来发现VUE前端在请求的时候,先发送了一个OPTIONS请求,也就是大家说的预请求,这个请求是获取不到Header里边的内容,如果OPTIONS请求不能正常处理,那么后边真正的POST的...
问题描述: Vue的开发者都知道axios,很多都用axios来进行数据交互,axios的默认请求头是Content-Type: application/json 使用这个请求头会出现向服务器请求两次的情况 为什么呢? 原因是:浏览器会首先使用 OPTIONS 方法发起一个预请求,判断接口是否能够正常通讯,如果不能就不会发送真正的请求过来,如果测试通讯正常,则开始真正的请求。 这样每个请求都会发送...