在当前项目中,前端通过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

转载于:https://www.cnblogs.com/gopark/p/9239202.html

一个Option请求引发的深度解析相关推荐

  1. 视频教程:Java常见面试题目深度解析!

    视频教程:Java常见面试题目深度解析! Java作为目前比较火的计算机语言之一,连续几年蝉联最受程序员欢迎的计算机语言榜首,因此每年新入职Java程序员也数不胜数.很多java程序员在学成之后,会面 ...

  2. Goroutine 并发调度模型深度解析之手撸一个高性能 goroutine 池

    文章目录 1 前言 2 Goroutine & Scheduler 2.1 线程那些事儿 2.1.1 用户级线程模型 2.1.2 内核级线程模型 2.1.3 两级线程模型 2.2 G-P-M ...

  3. 记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑

    我通过这篇文章把今天工作中遇到的HTTP跨域和OPTION请求的一个坑记录下来. 场景是我需要在部署在域名a的Web应用里用JavaScript去消费一个部署在域名b的服务器上的服务.域名b上的服务也 ...

  4. graphics 位深度_热门上海乐家人才公寓深度解析又是一个神

    热门上海乐家人才公寓深度解析又是一个神 提前来电预约看房可售楼处员工优惠5000元到20000元,免费专车接送/自驾报销路费,并可售楼处员工价格优惠!老带客户带新客户,还可奖励iPhonePro,新客 ...

  5. Spring cloud Gateway(二) 一个Http请求的流程解析

    Spring cloud Gateway(二) 一个Http请求的流程解析 简介     通过一个简单示例,debug出Spring Cloud Gateway的一个HTTP请求的处理流程 思路整理 ...

  6. 赵小楼《天道》《遥远的救世主》深度解析(81)一个不愿躺着对话的女人,应给与绝对尊严,这符合强势文化范畴

    本文是<天道>解读系列按<遥远的救世主>小说情节深度解析的第81集,解读完后会按<天道>电视剧不同于小说部分的情节再补充解读,然后会出专题解读系列,整体共约160集 ...

  7. 赵小楼《天道》《遥远的救世主》深度解析(58)丁元英听到芮小丹说自已击毙了一个罪犯后心里的那一颤

    本文是<天道>解读系列按<遥远的救世主>小说情节深度解析的第58集,解读完后会按<天道>电视剧不同于小说部分的情节再补充解读,然后会出专题解读系列,整体共约160集 ...

  8. Java LockSupport以及park、unpark方法源码深度解析

    介绍了JUC中的LockSupport阻塞工具以及park.unpark方法的底层原理,从Java层面深入至JVM层面. 文章目录 1 LockSupport的概述 2 LockSupport的特征和 ...

  9. 深度解析OSPF(开放最短路径优先协议)

    深度解析OSPF(开放最短路径优先协议) 目录 OSPF基本概念 邻接状态的建立 OSPF七种状态 邻接建立条件 DR与BDR的选举细节 虚链路 OSPF常见六种LSA(链路状态数据库) 1号.路由器 ...

最新文章

  1. 【亲测可用】改变鼠标样式
  2. 阿里云与WPS深度合作,开放数据处理生态
  3. SQLite数据库损坏与修复
  4. 利用python爬虫(part7)--初识Xpath之Node节点
  5. EFCore查询语句生成流程、让EFCore支持批量Update/Delete/MergeInto
  6. textureview 旋转90度后平铺_C++初级编程NOIP题:11H1537: 图像旋转
  7. k2p华硕系统怎么设置_Linux怎么设置系统环境变量之export命令详解
  8. jQuery实现多条件筛选
  9. 批处理(bat)choice命令详解
  10. Python3 - 深入学习Docker容器管理
  11. 桌面计算机恢复出厂设置,windows7电脑怎么恢复出厂设置
  12. 小学计算机英语,小学英语电脑版
  13. 折下我的翅膀,送你飞翔
  14. python小技巧之:同时安装py2和py3,如何在指定的版本下pip安装包
  15. 深入了解Xcode 7——代码编辑
  16. 人工智能如何入门学习?前景如何
  17. android 命令编译java文件,在WIN10上使用cmd窗口命令编译Android OpenCV
  18. 戴尔在哪看计算机的显卡,戴尔电脑显卡天梯图,2018dell电脑显卡天梯图新版
  19. 功率器件-功率晶体管 GTR
  20. android 防录屏 sdk,如何使用DRM-X4.0保护Zoom Web SDK?(Zoom会议直播防录屏)

热门文章

  1. spring 注解方式配置Bean
  2. 利用find同时查找多种类型文件
  3. 解决三星手机EditText背景色的问题
  4. IOS UIPageController
  5. VS插件的开发 - Visual Studio Addin
  6. 230. Kth Smallest Element in a BST
  7. python Tags 母板 组件 静态文件相关 自定义simpletag inclusion_tag
  8. Laravel数据库迁移和填充(支持中文)
  9. Java Web的web.xml文件作用及基本配置(转)
  10. NEWS - InstallShield 2015 正式发布