跨域资源共享(CORS)--跨域ajax

几年前,网站开发者都因为ajax的同源策略而撞了南墙。当我们惊叹于XMLHttpRequest对象跨浏览器支持所带来的巨大进步时,我们很快发现没有一个方法可以使我们用JavaScript实现请求跨域访 问,对此我们哀叹不已。每个人在他们自己的网站上建立代理(which was the onset of a new host of open redirect problems)来摆脱这种限制。虽然开发者利用服务器代理和其它技巧避开了这种限制,而在社区的抗议者允许ajax在本地跨域调用。许多人还没意识到 当前几乎所有的浏览器(Internet Explorer 8+, Firefox 3.5+, Safari 4+和 Chrome)都可通过名为Cross-Origin Resource Sharing的协议支持ajax跨域调用。

跨域资源共享(CORS)

Cross-Origin Resource Sharing (CORS)是W3c工作草案,它定义了在跨域访问资源时浏览器和服务器之间如何通信。CORS背后的基本思想是使用自定义的HTTP头部允许浏览器和服务器相互了解对方,从而决定请求或响应成功与否。

对一个简单的请求,没有自定义头部,要么使用GET,要么使用POST,它的主体是text/plain,请求用一个名叫Orgin的额外的头部发送。Origin头部包含请求页面的头部(协议,域名,端口),这样服务器可以很容易的决定它是否应该提供响应。

Origin: http://www.nczonline.net

如果服务器确定请求被通过,它将发送一个Access-Control-Allow-Origin头部响应发送请求的同一个源,如果是一个公共资源,则返回“*”。如:

Access-Control-Allow-Origin: http://www.nczonline.net

 

如果头部丢失,或者源不匹配,那么浏览器将拒绝请求。如果一切顺利,浏览器将处理请求。注意,请求和响应都不包括cookie信息。

先前提到的所有浏览器都支持这些简单的请求。FF3.5 +,Safari 4和chrome通过使用XMLHttpRequest对象支持其使用。当尝试在不同域打开一个资源时,不需任何代码,这个行为会自动触发。如:

var xhr = new XMLHttpRequest();

xhr.open("get", "http://www.nczonline.net/some_resource/", true);

xhr.onload = function(){  //instead of onreadystatechange

    //do something

};

xhr.send(null);

在IE8中也是一样,用同样的方式你需要使用XDomainRequest object。

var xdr = new XDomainRequest();

xdr.open("get", "http://www.nczonline.net/some_resource/");

xdr.onload = function(){

    //do something

};

xdr.send();

Mozilla小组在他们关于CORS的留言中建议应该检查withCredentials属性的存在性,从而决定浏览器是否通过XHR支持CORS。你可以合并XDomainRequest 对象的存在性来支持所有的浏览器:

function createCORSRequest(method, url){

    var xhr = new XMLHttpRequest();

    if ("withCredentials" in xhr){

        xhr.open(method, url, true);

    } else if (typeof XDomainRequest != "undefined"){

        xhr = new XDomainRequest();

        xhr.open(method, url);

    } else {

        xhr = null;

    }

    return xhr;

}

 

var request = createCORSRequest("get", "http://www.nczonline.net/");

if (request){

    request.onload = function(){

        //do something with request.responseText

    };

    request.send();

}

Firefox, Safari, 和Chrome的XMLHttpRequest对象与IE的XDomainRequest对象有着相似的充分的接口,这些模式运行的很好。常见的接口属性/方法:

· abort()——用来终止已在进程中请求。

· Onerror()——替代onreadystatechange方法来探测错误。

· Onload()——替代onreadystatechange方法来探测成功。

· responseText——用来取得响应地文本。

· send()——用来发送请求。

Preflighted请求

除了GET或POST,通过一种称之为preflighted请求的服务器透明验证机制,CORS允许使用自定义的头部和方法,以及不同主体内容类型。当你尝试使用高级选项中的一个来试着建立一个请求时,这时就建立了一个preflighted请求。该请求使用可选的方法,并发送如下头部:

· Origin——与简单请求相同。

· Access-Control-Request-Method——请求将要使用的方法。

· Access-Control-Request-Headers——(可选)一个逗号分开的正被使用的自定义头部列表。

例子假定一个头部自定义为NCZ的POST请求:

Origin: http://www.nczonline.net
Access-Control-Request-Method: POST
Access-Control-Request-Headers: NCZ

在请求期间,服务器能决定是否允许这类请求。服务器通过在响应中发送以下头部来与浏览器通信。

· Access-Control-Allow-Origin——与简单请求相同。

· Access-Control-Allow-Methods——用逗号分开的可接受的方法列表。

· Access-Control-Allow-Headers——用逗号分开的服务器可接受的头部列表。

· Access-Control-Max-Age——preflighted 请求应该被缓存的时间。

如:

Access-Control-Allow-Origin: http://www.nczonline.net
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Headers: NCZ
Access-Control-Max-Age: 1728000

preflighted 请求一旦作出,结果将按响应中规定的时间缓存下来;第一次做出这样的请求,你将引发一次额外的HTTP请求。

Firefox 3.5+, Safari 4+和Chrome都支持preflighted 请求,IE8则不支持。

Credentialed请求

默认状态下,跨域请求不提供证书(cookie、HTTP身份验证、客户端SSL证书)。你可以规定一个请求应该通过设置withCredentials属性为true来发送证书。如果服务器允许credentialed请求,那么它将用下面的头部作出响应:

如果一个credentialed请求被发送,这个头部不会作为响应地一部分被发送。浏览器不会将响应传递给JavaScript(responseText是一个空字符串,状态为0,onerror()被调用)。注意,服务器也能发送这个HTTP头部作为preflight响应的一部分,以此来表明该源允许发送credentialed请求。

Access-Control-Allow-Credentials: true

IE8不支持withCredentials属性,Firefox 3.5+, Safari 4+和Chrome都支持它。

结论

在 现代web浏览器中对跨域AJAX调用有许多可靠地支持,然而,大多数开发者仍没意识这些强大的功能力。只需在JavaScript和服务器端做一点额外 的工作以保证正确的头部被发送即可使用它。在允许高级请求和credentialed请求方面,IE8的执行有些滞后,但希望它对CORS的支持将会继续 改进。如果你想了解更多,我强烈建议你检查Arun Ranganathan的示例页。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wireshark和 TcpDump抓包分析心得

1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话,我直接用tcpdump了,因为我工作环境中的Linux一般只有字符界面&#x…

StringBuffer和StringBuilder使用方法比較

StringBuffer是字符串缓冲区,是一个容器。 特点: 1,长度是可变化的。2,能够字节操作多个数据类型。 3,终于会通过toString方法变成字符串。 C create U update R read D delete1,存储。StringBuffer append…

遇到可爱女生如何搭讪?

1 旺仔落泪▼。。。2 养狗一日,用狗一时(素材来源网络,侵删)▼3 试图混进芒果里的鹦鹉(素材来源网络,侵删)▼4 把滴滴司机的坐垫沾走了▼5 如何高效记单词(素材来源网络&#xf…

Tomcat 上添加虚拟相对路径

为什么80%的码农都做不了架构师&#xff1f;>>> <Context docBase"D:/SHARP" path"/test" reloadable"true" /> 转载于:https://my.oschina.net/zz006/blog/754631

198道K8sDocker面试真题大汇总,全网最全八股!

最近看到两个数据&#xff0c;想跟你们分享一下&#xff1a;一是&#xff0c;目前云原生开发人员已经达680万&#xff08;SlashData数据&#xff09;&#xff1b;二是&#xff0c;云和容器技术首超Linux&#xff0c;成最受青睐技能&#xff08;Linux基金会数据&#xff09;。云…

python ctypes 指针_Python Ctypes传递.h文件中定义的结构指针。

我认为您可能缺少的是确切地知道您希望分配结构内存的位置。下面的c代码提供了一个为struct分配内存并返回指向它的指针的函数&#xff08;new_struct&#xff08;&#xff09;&#xff09;。#include #include #include typedef struct { int a; int b; } my_struct; my_st…

iptables 手册

iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables&#xff0c;因此理解如何配置iptables将会帮助你更有效地管理Linux防火墙。如果你是第一次接触iptables&#xff0c;你会觉得它很复杂&#xff0c;但是一旦你理解iptables的工作原理&#x…

Android之如何看混淆后的错误日志代码

第一步&#xff1a; 找到混淆的mapping.txt文件 build -> outputs -> mapping -> release -> mapping.txt 或者&#xff1a;1项目目录的progurad下有一个mapping.txt文件 这是混淆后的名字 和原名字的映射关系。 第二步: 找到项目用的sdk依次定位到sdk -> to…

inode

硬盘的最小存储单位叫“扇区(sector)”,每个扇区存储512字节(相当于0.5kb).系统读取硬盘时&#xff0c;只会读取多个sector即一个block.block 是文件存取的最小单位block的大小为&#xff14;kb,也就是8*sector1block. inode 是存放文件的元信息&#xff0c;如文件的创建者&…

男朋友的回答可以多敷衍?

1 跟最好的朋友好到什么程度&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 不要在妈妈打麻将的时候要生活费&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 现在卖家还要发毒誓了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 刘德华老师…

Android之android.os.DeadObjectException原因

问题&#xff1a; 今天看到客户的手机出现了 &#xfeff;&#xfeff;andorid.os.DeadObjectException android.os.DeadObjectException 07-13 18:28:45.398: W/System.err(32272): at android.os.BinderProxy.transact(Native Method) 原因&#xff1a; 我们项目有2个进程 …

学习Java,容易被你忽略的小细节(2)

昨天心情真的太糟糕了&#xff0c;写完《学习Java&#xff0c;值得注意你注意的问题&#xff08;1&#xff09;》之后&#xff0c;迎来些许的支持以后就是一片片的谴责。我的主页上涌现出许许多多Java方面的牛人&#xff0c;谴责我水平太低&#xff0c;写的问题太初级。搞得我非…

WPF XAML 为项目设置全局样式

全局资源样式属性App.xaml<Application.Resources><ResourceDictionary><br><ResourceDictionary.MergedDictionaries><ResourceDictionary Source"Dictionary.xaml"/></ResourceDictionary.MergedDictionaries><br><S…

controller是什么意思_SpringMVC是什么??

SpringMVC是什么&#xff1f;一&#xff0c;首先是一个MVC框架。在web模型中&#xff0c;MVC是一种很流行的框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;把较为复杂的web应用分成逻辑清晰的几部分&#xff0c;是为了简化开发&#xff0…

起一卦都这么凶

公元&#xff1a;2014年5月22日0时15分14秒阳8局农历&#xff1a;2014年04月24日0时15分立夏&#xff1a;2014-5-5 22:16:00 芒种&#xff1a;2014-6-6 2:32:00干支&#xff1a;甲午年己巳月癸巳日壬子时旬空&#xff1a;辰巳空戌亥空午未空寅卯空直符&#xff1a;天冲直使&am…

You third iOS app,这个APP要放到手机上面运行,才会成功,才会新建记录。

当提示如上图所示时&#xff0c;很可能你只有在苹果设备上运行才可以提示成功&#xff0c; iCloud is available。 转载于:https://www.cnblogs.com/liqiwa/p/5933542.html

TCP/IP、Http、Socket的区别

TCP/IP、Http、Socket的区别 大学学习网络基础的时候老师讲过&#xff0c;网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。通过初步的了解&#xff0c;我知道IP协议对应于网络层&#xff0c;TCP协议对应于传输层&#xff0c;而HTTP协议对应于应…

客户要求ASP.NET Core API返回特定格式,怎么办?(续2)

前言前2次&#xff0c;我们都是假设客户需要返回不同的字符串格式。但是&#xff0c;有可能客户要求的返回是非本文格式&#xff0c;比如文件流。怎么办&#xff1f;思路前提&#xff0c;当然还是使用同一API接口&#xff0c;不影响现有使用方式。虽然ASP.NET Core Web API默认…

第四章例题、心得及问题。

例题4-1&#xff1a; #include<stdio.h> #include<math.h> int main(void) {int denominator,flag;double item,pi;flag1;denominator1;item1.0;pi0;while(fabs(item)>0.0001){itemflag*1.0/denominator;pipiitem;flag-flag;denominatordenominator2;}pipi*4;pr…