为什么跨源头http head请求求需要预检检查

AJAX(XMLHttpRequest)进行跨域请求方法详解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
AJAX(XMLHttpRequest)进行跨域请求方法详解
上传于||文档简介
&&AJAX(XMLHttpRequest)进行跨域请求方法详解
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩9页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
现代造船电子海关系统的建模和实现.pdf86页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:200 &&
你可能关注的文档:
··········
··········
现代造船电子海关系统的建模与实现 申请上海交通大学工程硕士学位论文 现代造船电子海关系统的建模与实现 学校代码: 10248 作者姓名: 孙嘉 学
号: 10座机电话号码 第一导师: 步丰林 第二导师: 朱煜 学科专业: 软件工程 答辩日期: 年 月 日 上海交通大学软件学院 年 月
万方数据 现代造船电子海关系统的建模与实现 A Dissertation Submitted to Shanghai Jiao Tong University for Master Degree of Engineering THE MODELING AND APPLICATION OF ELECTRONIC CUSTOMS SYSTEM ON MODERN SHIPBUILDING MODE University Code : 10248 Author : Sun Jia Student
ID: 10座机电话号码 Mentor 1 : Bu Fenglin Mentor 2: Zhu Yu Field : Software
Engineering Date of Oral Defense: Shanghai Jiaotong University
万方数据 现代造船电子海关系统的建模与实现 上海交通大学 学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独立进 行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不包含 任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重 要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声 明的法律结果由本人承担。 学位论文作者签名: 日期: 年
万方数据 现代造船电子海关系统的建模与实现 上海交通大学 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意 学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文 被查阅和借阅。本人授权上海交通大学可以将本学位论文的全部或部分内 容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存 和汇编本学位论文。 保密□,在 年解密后适用本授权书。 本学位论文属于
正在加载中,请稍后...跨域资源共享CORS总结 - 简书
跨域资源共享CORS总结
摘要:CORS是一个W3C标准,全程是“跨域资源共享”(Cross-origin resource sharing)。CORS允许浏览器向跨源服务器发出XMLHttpRequest请求,以克服AJAX只能基于同源策略的使用限制。本文将详细介绍CORS的内部机制。
CORS需要浏览器与服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求(如添加了Origin :
: accept, content-type,Access-Control-Request-Method : POST),但是用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口或者约定,就可以跨源通信。
2.两种请求
浏览器把CORS请求分成:简单请求(Simple Request)和非简单请求(Not-so simple request)。
只要同时满足一下两个条件,就属于简单请求。
(1)请求方法是HEAD/GET/POST三种方法之一;
(2)HTTP的头信息不超出一下几种字段:Accept/Accept-Encoding/Accept-Language/Cache-Control/Connection/Cookie/Host/If-Modified-Since/Referer/User-Agent/Content-Type/Content-Language。其中Content-Type仅限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/pain。
凡是不满足上面两个条件,就属于非简单请求。浏览器对于两种请求的处理是不一样的。
3.1 基本流程
对于简单请求,浏览器直接发出CORS请求,在HTTP HEADER中增加了Origin字段。如下:
POST /nlp/segment HTTP/1.1
Host: 10.1.222.80:8084
Connection: keep-alive
Content-Length: 90
Accept: */*; q=0.01
Origin: http://localhost:63343
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0. Safari/537.36
Content-Type: application/ x-www-form-charset=UTF-8
Referer: http://localhost:63343/BZZZ/bz.html?_ijt=eu8vkf2u50ccl1gshpr4lhjt3r
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,q=0.8
上面的头信息中,Origin字段用来说明,本次请求来自哪个源(协议+域名+端口)。服务器根据这个值,决定是否同意这次请求。如果Origin制定的源不在许可范围之内,服务器会返回一个正常的HTTP回应。浏览器发现Http Response头信息中没有包含Access-Control-Allow-Origin字段,就判断出错并抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200.
如果Origin制定的域名在许可范围内,服务器返回的响应中多出几个头信息字段:
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,POST,PUT,OPTIONS,DELETE
Access-Control-Expose-Headers: FooBar
Access-Control-Allow-Origin:*
Content-Type:text/ charset=UTF-8
上面的头信息中,有三个与CORS请求相关的字段,均以Access-Control-开头。(1).
Access-Control-Allow-Origin
该字段是必须的,它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。(2).
Access-Control-Allow-Credentials
该字段可选,它是一个Bool值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求中,设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值只能设为true,没有false取值,如果服务器不要浏览器发送Cookie,删除该字段即可。(3).
Access-Control-Allow-Methods
该字段可选,如果允许跨域请求的方法是PUT/GET/POST/OPTIONS/DELETE等其中的一项或几项,就需要设置该字段的值为”PUT,GET,POST,OPTIONS”。(4).
Access-Control-Expose-Headers
该字段可选,CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6哥基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers字段中指定。上面的例子制定,getResponseHeader(’FooBar’)可以返回FooBar字段的值。(5).
Access-Control-Allow-Headers
该字段可选,CORS请求时,如果是自定义Http Request Header,就必须在该字段中指定对应的Header Name,如例子中自定义Header为’Test’,那么需要在服务器端制定该字段为’Test’。
3.2 withCredentials属性
上面提到CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段。
Access-Control-Allow-Credentials: true
另外一方面,开发者必须在AJAX请求中打开withCredentials属性。如下:
var xhr = new XMLHttpRequest();
xhr.withCredentials =
否则,即使服务器同意发送Cookie,浏览器也不会发送。或者服务器要求设置Cookie,浏览器也不会处理。如果省略withCredentials字段设置,有些浏览器还是会一起发送Cookie。这时需要显示关闭withCredentials。xhr.withCredentials =
需要注意的是,如果发送Cookie,Access-Control-Allow-Origin就不能设为”*”,必须制定明确的、与请求网页一直的域名。同时Cookie依然遵循同源侧策略,只有用服务器域名设置设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)发起请求的网页代码中document.cookie无法读取服务器域名下的Cookie。
非简单请求
4.1 预检请求
非简单请求是对服务器有特殊要求的请求,比如请求方法是PUT/DELETE,或者Content-Type字段的类型是application/json。非简单请求的CORS请求,会在正式itongxin之前,增加爱一次HTTP查询请求,叫预检请求(preflight)。
浏览器现询问服务器,当前网页所在的域名是否在服务器的许可名单中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。下面是一段浏览器的JS脚本:
var test1 = {method:"segment", format:"json", message:["我是中国人!","欢迎来到中国"]};
url : "http://10.1.222.80:8084/nlp/segment",
type : "post",
dataType : "json",
contentType:"application/charset=utf-8",
data :JSON.stringify(test1),
crossDomain: true,
/*headers:{
"Content-Type":"application/x-www-form-urlencoded"
timeout : 10000
上面的请求中是Content-Type为application/json的请求。浏览器认为这是一个非简单请求,自动向服务器发送一个预检请求,要求服务器确认可以这样请求。下面是预检请求的HTTP头信息:
OPTIONS /nlp/segment HTTP/1.1
Host: 10.1.222.80:8084
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:63343
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0. Safari/537.36
Access-Control-Request-Headers: accept, content-type
Accept: */*
Referer: http://localhost:63343/BZZZ/bz.html?_ijt=eu8vkf2u50ccl1gshpr4lhjt3r
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,q=0.8
预检请求使用的请求方法是OPTIONS,表示这个请求用来询问。头信息中关键字段是Origin,表示请求来自哪个源。除了Origin字段,预检请求的头信息还包括两个特殊字段:
Access-Control-Request-Method
该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,例子中是POST。
Access-Control-Request-Headers
该字段是都好分割的字符串,指定浏览器CORS请求会额外发送的头信息字段,上面的例子默认application/json对应的额外字段是”Content-Type”。
4.2 预检请求的回应Response
服务器收到预检请求后,检查Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,并做出回应。如下:
HTTP/1.1 200 OK
Content-Type: text/ charset=UTF-8
Connection: close
Time-Used: 25ms
Content-Length-UnGzipped: 7
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,OPTIONS,DELETE
Access-Control-Allow-Headers: Content-Type
Content-Encoding: gzip
Content-Length: 33
上面的Http Response中,关键是Access-Control-Allow-Origin字段,表示
如果服务器否定了预检请求,会返回一个正常的HTTP Response,但是没有任何CORS相关的头信息字段。这时候浏览器认为i额服务器不同意预检请求,因此出发一个错误,被XMLHttpRequest对象的onerror毁掉函数捕获。控制台会打印出如下报错信息。
XMLHttpRequest cannot load http://localhost:63343.
Origin http://localhost:63343 is not allowed by Access-Control-Allow-Origin.
服务器响应的CORS其他相关字段如下:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,OPTIONS,DELETE
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods
该字段是必需的,其取值是逗号分割的字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的哪个方法。这个是为了避免多次预检请求。
Access-Control-Allow-Headers
如果浏览器请求包括Access-Control-Allow-Headers字段,则该字段是必须的,其取值是一个逗号分割的字符串,表明服务器支持的所有头信息字段,不限于浏览器在预检中请求的字段。
Access-Control-Allow-Credentials
该字段与简单请求时字段含义相同。
Access-Control-Max-Age
该字段可选,用来制定本次预检请求的有效期,单位为秒。缓存于浏览器中,在有效期中,不需要发出另一条预检请求。
浏览器的正常请求和回应
一旦服务器通过了预检请求,以后每次浏览器正常的CORS请求就都与简单请求一样,包括Origin字段信息。服务器的回应也会有Access-Control-Allow-Origin字段。
与JSONP比较
CORS与Jsonp使用目的相同,但是Jsonp只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的有时在于支持老式浏览器,以及向不支持CORS的网站请求数据。»»AJAX 跨源 HTTP 请求
  跨源HTTP请求(也称跨域AJAX请求)是大多数Web开发人员可能遇到的一个问题,根据,浏览器将限制客户端的JavaScript在一个安全沙箱内,通常JS不能直接同一台不同的域的远程服务器通信。在过去,开发者们创造了许多解决方法以实现跨域资源请求,常用的方法如下:
使用Flash/Silverlight或服务器端&代理&来与远程通讯&
在iframe中嵌入远程服务器并通过fragment或window.name通信,参考这里。
  如此等等..
  这些解决方法或多或少都有问题,比如使用JSONP时若只是简单的&eval&将导致安全漏洞,#3虽然能用,但两个域间必须依据严格的协议,恕我直言它既不灵活也不优雅
  W3C已经引入了作为能够解决该问题并提供安全、灵活以及推荐标准的解决方案。
  从较高的层次来看我们可以简单认为CORS 是介于 域A客户端 的AJAX调用 和一个托管在域B的页面 之间的契约, 一个典型的跨源 请求或者响应将会是这样:
  域 A 的 AJAX 请求头
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/ Firefox/4.0 &
Accept text/html,application/xhtml+xml,application/q=0.9,*/*;q=0.8,application/json &
Accept-Language en- &
Accept-Encoding gzip, deflate &
Keep-Alive 115 &
  域 B 的 响应头
Cache-Control private /& Content-Type application/ charset=utf-8 &
&Access-Control-Allow- &
Content-Length 87 &
Proxy-Connection Keep-Alive &
Connection Keep-Alive
  我上面标记的蓝色部分是关键实现,&&Origin& 请求头表示 &或者&&源于哪里, &&Access-Control-Allow-Origin& 请求头 表示这个页面允许来自域A 的请求(其值为 * 表示允许任何域的远程请求)。
  像我上面提到的,W3 建议浏览器在提交实际跨源HTTP 请求前,实现&预检请求&, 简而言之,就是一个HTTP OPTIONS 请求:
/foo.aspx HTTP/1.1
  如果 foo.aspx 支持 OPTIONS HTTP 指令, 它可能会像下面这样返回响应:
HTTP/1.1 200 OK &
Date: Wed, 01 Mar :19 GMT &
Access-Control-Allow-Origin:& & &
Access-Control-Allow-Methods: POST, GET, OPTIONS, HEAD &
Access-Control-Allow-Headers: X-Requested-With &
Access-Control-Max-Age: 1728000 &
Connection: Keep-Alive &
Content-Type: application/json
  只有满足在响应中包含 &Access-Control-Allow-Origin& , 并且其值为 &*& 或者包含提交CORS请求的域,这些强制条件的浏览器才能提交正式的跨域请求, 并在 &&中缓存请求结果&。
  让我们看一下服务器端代码,例子如下(ASP.NET和PHP)
  ASP.NET (C#)
protected void Page_Load(object sender, EventArgs e)
String data = String.E
String returnJSONStr = String.E
switch (Request.HttpMethod)
case &GET&:
data = Request.QueryString[&Data&];
returnJSONStr = &{\&Data\&:\&Hi remote friend, you tried to passed me data: *& + data + &* through HTTP GET.\&}&;
case &POST&:
data = Request.Form[&Data&];
returnJSONStr = &{\&Data\&:\&Hi remote friend, you tried to POST some mock data: *& + data + &* to me.\&}&;
case &OPTIONS&:
returnBadRequestResponse();
if (String.IsNullOrEmpty(data))
returnBadRequestResponse();
Response.AddHeader(&Access-Control-Allow-Origin&, &*&);
Response.ContentType = &application/json&;
Response.Write(returnJSONStr);
private void returnBadRequestResponse()
Response.StatusCode = 400;
Response.ContentType = &application/json&;
Response.Write(&{\&Error\&:\&Bad HTTP request type!\&}&);
if(isset($[&Data&]))
$method=$_SERVER[&REQUEST_METHOD&];
if($method==&POST&)
$data=$_POST[&Data&];
$fakeData=new FakeData();
$fakeData-&Data=&Hi remote friend, you tried to POST some mock data: *&+data+&* to me.&;
$fakeData-&Time=new DateTime(&now&);
elseif($method==&GET&)
$fakeData=new FakeData();
$fakeData-&Data=&Hi remote friend, you tried to passed me data: *&+data+&* through HTTP GET.&;
$fakeData-&Time=new DateTime(&now&);
RaiseError();
header(&Content-type: application/json&);
$jsonStr= json_encode($fakeData);
echo($jsonStr);
RaiseError();
function RaiseError()
http_send_status(405);
header(&Status: 405 Method Not Allowed&);
/*Classes definition*/
class FakeData
  客户端AJAXY发起请求代码:
var cor = // cor stands for Cross-Origin request
if (window.XMLHttpRequest) {
cor = new XMLHttpRequest();
//else if (window.XDomainRequest) {
//cor = new XDomainRequest();
alert(&Your browser does not support Cross-Origin request!&);
cor.onreadystatechange = function () {
if (cor.readyState == 4) {
document.getElementById(&lbl&).innerHTML = cor.responseT
var data = &Some fake data&;
if (method == &POST&) {
cor.open(&POST&, &/Demo/CORSDemo/CORSDemoServer.aspx&, true);
cor.withCredential = &true&;
cor.setRequestHeader(&Content-Type&, &application/x-www-form-urlencoded&);
cor.send(&Data=& + data);
else if (method == &GET&) {
cor.open(&GET&, &/Demo/CORSDemo/CORSDemoServer.aspx?Data=& + data, true);
cor.withCredential = &true&;
cor.send(null);
  JS代码适用于所有主流浏览器(IE8+, FF 3.6+, Chrome 8+),我没有用IE8所采用的XDomainObject,因为 IE8+, FF and Chrome, Safari等浏览器支持XMLHTTP请求。而且XDomainObject(XDR)似乎有很多限制(参考:&)
  跨源资源共享为网站开发人员实现跨源通信提供了一个安全,灵活,标准的方案。也许是时候摈弃像JSONP,Flash,Silverlight,server bridge以及window.name等等并不是很实用的方法。
 参考资料
跨源资源共享&
HTTP权限控制
IIS Verbs configuration
  原文地址:
验证消息:Admin10000
提示:更多精彩内容关注微信公众号:全栈开发者中心(admin10000_com)
理智评论文明上网,拒绝恶意谩骂 发表评论 / 共0条评论
登录会员中心市治超办来湘潭县督导车辆超限超载专项治理预检工作
湘潭市治超办来县督导车辆超限超载专项治理预检工作。   红网湘潭县站12月17日讯(分站记者 莫锦文 通讯员 胡烨婧)为迎接省治超办开展的2015年第三次货运车辆超限超载率调查,确保湘潭县货运车辆超限超载率控制在0.5%以下,12月16日,湘潭市治超办检查组来湘潭县开展车辆超限超载专项治理预检工作。湘潭县委常委、副县长、县治超办常务副组长刘铁强及县治超办、县公安局、县交通局、县公路局相关负责人参与检查。    检查组一行首先来到吴家巷超限超载检测站,了解了站场建设及配套设施完善情况,同时检查了检测站内办公设施、人员配备及工作开展情况。检查组要求,要根据迎省检工作的要求,对站场建设情况进行完善,对站场环境进行优化,并按要求在过磅检测区安装摄像头。    随后,检查组沿107国道进行了路检,并走访了潭建佳程混凝土有限公司和河口千吨级码头,查看了源头企业治超宣传情况及公司货物进出台账。针对当前超限超载专项治理的工作,检查组强调,一是要严格按要求落实基础数据、完善工作台账和治超宣传标语设置等迎检工作;二是要加强货运企业源头监管,派驻专人在各源头企业24小时值守,禁止一切超限超载车辆、违法改装车辆进出企业;三是要抓好勤务落实,持续加大货运车辆检查力度,确保路面治超无死角、无盲区,对发现的货运车辆超载、超限、非法改装改型等交通违法行为,一律坚决依法处理,形成严管高压态势,确保在超限超载率检测中取得好成绩。}

我要回帖

更多关于 nginx head 请求 限制 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信