在前后台分离的项目中,经常会遇到浏览器想服务端发送一个post/patch请求,实际上产生了两个请求,一个是Option,另一个才是真实的Post/Patch请求, 而get请求则不会产生Options请求。

 

 造成此种问题的原因是浏览器处理跨域的机制,下面来掰扯一下为什么会出现Option请求。

Options请求出现的情况有两种:

1、获取后台服务器支持的HTTP的通信方式

2、对跨域请求进行preflight request(预检请求)。

预检请求首先需要向另外一个域名的资源发送一个Http Options的请求头,以检测实际发送的请求是否是安全的。options请求是浏览器自发起的preflight request(预检请求)。

 

preflight request请求报文中有两个需要关注的首部字段:

(1)Access-Control-Request-Method:告知服务器实际请求所使用的HTTP方法;

(2)Access-Control-Request-Headers:告知服务器实际请求所携带的自定义首部字段。

同时服务器也会添加origin header,告知服务器实际请求的客户端的地址。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求。

服务器所返回的Access-Control-Allow-Methods首部字段将所有允许的请求方法告知客户端,返回将所有Access-Control-Request-Headers首部字段将所有允许的自定义首部字段告知客户端。此外,服务器端可返回Access-Control-Max-Age首部字段,允许浏览器在指定时间内,无需再发送预检请求,直接用本次结果即可。

在我们开发过程中出现的浏览器自发起的options请求就是上面的第二种情况。实际上,跨域请求中的”复杂请求”发出前会进行一次方法是options的preflight request。

二、当跨域请求是简单请求时不会进行preflight request,只有复杂请求才会进行preflight request。

跨域请求分两种:简单请求、复杂请求;

符合以下任一情况的就是复杂请求:

1.使用方法put/delete/patch/post;

2.发送json格式的数据(content-type: application/json)

3.请求中带有自定义头部;

其他情况则可理解为是简单请求。

为什么跨域的复杂请求需要preflight request

复杂请求可能对服务器数据产生副作用。例如delete或者put,都会对服务器数据进行修改,所以在请求之前都要先询问服务器,当前网页所在域名是否在服务器的许可名单中,服务器允许后,浏览器才会发出正式的请求,否则不发送正式请求。

posted @ 2019-09-11 14:34 Bradwarden 阅读(8370) 评论(1) 推荐(1) 编辑
摘要: 使用Antdesign Form时,当页面加载时,需要从后台获取数据,对Form中控件的默认赋值。看似比较简单的需求,而且Antdesign 官方文档中也有相应介绍,然后对于Form 的CheckBox 的默认值加载,文档中并没有涉及。 需求: 当页面记载时,从后台获取当前Form 对象值,然后将值 阅读全文
posted @ 2019-08-13 15:17 Bradwarden 阅读(4216) 评论(0) 推荐(0) 编辑
摘要: 有时候我们会在windows 下开发spark程序,测试程序运行情况,再部署到真实服务器中运行。 那么本文介绍如何在windows 环境中搭建简单的基于hadoop 的spark 环境。 我的windows环境为 Win7 64位 第一步,安装Python环境 这里不多讲,我的环境为python 3 阅读全文
posted @ 2019-05-28 22:46 Bradwarden 阅读(3684) 评论(0) 推荐(0) 编辑
摘要: 最近想将一些句子翻译成不同的语言,最开始想使用Python向有道发送请求包的方式进行翻译。 这种翻译方式可行,不过只能翻译默认语言,不能选定语言,于是我研究了一下如何构造请求参数,其中有两个参数最复杂(salt 和 sign),网络上有很多人发现如何破解,不过我尝试过后发现并不能用,有道已经改版了( 阅读全文
posted @ 2018-09-08 22:34 Bradwarden 阅读(2956) 评论(2) 推荐(0) 编辑
摘要: 今天闲来无事在家倒腾了一下目前比较流行的docker,以前看过相关的文档,印象中docker只能安装在win10/win server2016版本之上,且必须开启hype-v功能,这也是官网中有明确介绍的,但其实有其他的tool可以帮助我们在win7 x64中安装docker,下面请跟随如下几步在w 阅读全文
posted @ 2017-06-18 14:04 Bradwarden 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 刚接触servlet 3.0,使用注释描述servlet 但是无论部署好了无论如何访问都报404,纠结了很久,是因为web.xml 里面的一个属性设置有问题 将 改为 为什么将metadate-complete设置为false,就可以运行了呢? 因为: Servlet 3.0 的部署描述文件 web 阅读全文
posted @ 2017-02-20 23:09 Bradwarden 阅读(3126) 评论(0) 推荐(0) 编辑
摘要: PowerShell是一种命令集,也有自己的语法定义及函数。本文主要介绍如何自定义powershell函数及如何调用,当初在写PowerShell自定义函数的时候查阅了很多资料都没找到如何调用自定义函数,还是无意中从同事以前写的脚本中才知道方式奇特的PowerShell函数调用方式,以此记录下来,以方便后续参考。 阅读全文
posted @ 2013-10-15 15:01 Bradwarden 阅读(19500) 评论(1) 推荐(1) 编辑
摘要: 范型在c#编程中经常使用,而经常用list 去存放实体集,因此会设计到对list的各种操作,比较常见的有对list进行排序,查找,比较,去重复。而一般的如果要对list去重复如果使用linq distinct方式,会遇到一些坑爹的问题,发现结果集中还是存在重复数据,原因是使用这种方法是对对象的引用去重复,并不满足我们的需求。因此本文通过c#代理的方式实现对list distinct操作。 阅读全文
posted @ 2013-10-11 21:39 Bradwarden 阅读(3706) 评论(1) 推荐(3) 编辑
摘要: Asp.net button按钮点击后想要实现幕布效果来等待服务器端执行完成,这种需求虽说看起来很简单,但真实做起来并不是那么简单,涉及了很多细节点,而对于深入理解asp.net button生命周期的人来说自然不用多费周折。本人在完成此功能的时候想到了很多办法,下面将我解决此问题的过程一一分享。申明一下,做这种需求时项目已经接近尾声,因为是基于SharePoint 2007的项目(坑爹之处也在此了),而且整个项目并没有涉及到WCF或者Web Service的服务或者是handle,我更不可能为了这一点功能直接去更改项目的结构,通过javascript去用ajax来实现。所以蛋疼的一幕幕出来了。 阅读全文
posted @ 2013-10-10 17:01 Bradwarden 阅读(2708) 评论(8) 推荐(1) 编辑
摘要: 练习借用开发MOSS2010的模式去开发MOSS2007,之SharePoint2007 WebPart动态加载UserControl.这篇文章仅仅属于SharePoint开发入门级,请大师们略过。。。 阅读全文
posted @ 2013-08-13 19:11 Bradwarden 阅读(1089) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示