转载:http://mutongwu.iteye.com/blog/1637183

CORS浏览器支持:Firefox 3.5+,Safari 4+,Chrome,Safari for iOS,and WebKit for Android

//页面A:http://shawn.test2.com/crossAjax.html
functioncreate(){

varobjXMLHTTP=newXMLHttpRequest();
objXMLHTTP.open('GET','http://www.test.com:8080/jsp/json.jsp',true);

//objXMLHTTP.setRequestHeader("hello","world");

objXMLHTTP.onreadystatechange=function(){
if(objXMLHTTP.readyState==4){
alert(objXMLHTTP.responseText);
}
};
objXMLHTTP.send(null);
}
//后端页面B:http://www.test.com:8080/jsp/json.jsp

<%

//允许来自http://shawn.test2.com(默认端口80)的请求。
response.setHeader("Access-Control-Allow-Origin","http://shawn.test2.com");

//允许所有
//response.setHeader("Access-Control-Allow-Origin","*");

/*cookie设置发送到浏览器端,不会生效。
StringcookieName="Sender";
Cookiecookie=newCookie(cookieName,"Test_Content");
cookie.setMaxAge(10);//存活期为10秒
response.addCookie(cookie);
*/

Stringstr="";
str+="{";
str+="\"result\":1";
str+=",\"data\":[5,7]";
str+="}";
out.print(str);
%>

允许多个域名? 可以考虑把 域名做一个白名单,读取到服务器,然后再进行匹配。

上述的这种跨域请求有几个限制:
1. 不会携带cookie信息到服务器端;服务器端也不能写cookie到客户端;
2. 不能通过setRequestHeader()自定义头部信息;
3. getAllResponseHeaders()返回值为空字符串。
关于预检请求(Preflighted Request):
事实上,如果用户通过setRequestHeader自定义了头部信息,浏览器会默认先发送一个请求,用了判断请求是否合法,如果不通过,
ajax请求就失败了,如果通过了,浏览器会再发一次请求,读取服务器的返回数据。
例如,上述例子中,如果调用:
objXMLHTTP.setRequestHeader("hello","world");
则浏览器会发出请求,内容为空,请求头部为:
OPTIONS /jsp/json.jsp HTTP/1.1
Host: www.test.com:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,* / * ;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://shawn.test2.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: hello
注意,头部请求中,多出几个选项:
如果想采用POST方式提交ajax数据,需要手动设置

functioncreate(){

varobjXMLHTTP=newXMLHttpRequest();
objXMLHTTP.open('POST',true);

objXMLHTTP.setRequestHeader("Content-type","application/x-www-form-urlencoded");
objXMLHTTP.setRequestHeader("hello","world");
objXMLHTTP.onreadystatechange=function(){
if(objXMLHTTP.readyState==4){
alert(objXMLHTTP.responseText);
}
};
objXMLHTTP.send("userName=shawn");
}

因为这里定义请求头,所以后端也需要做设置支持:

<%
response.setHeader("Access-Control-Allow-Origin","http://shawn.test2.com");

//response.setHeader("Access-Control-Allow-Methods","GET,POST");//逗号分隔;默认可以不设置。
response.setHeader("Access-Control-Allow-Headers","Content-Type,hello");//逗号分隔

//预检测被缓存时间:30秒;默认可以不设置。在这个时间内,用户再次请求改数据,可以跳过预检测阶段。
//在firefoxV8里面,发现这个设置并没有生效。chromeV14、Safari5是生效的。
//response.setHeader("Access-Control-Max-Age","30");

Stringstr="";
str+="{";
str+="\"result\":1";
str+=",7]";
str+=",\"userName\":"+request.getParameter("userName");
str+="}";
out.print(str);
%>

浏览器支持预检请求:Firefox 3.5+,and Chrome
关于携带验证信息的请求(Credentialed Requests)如果希望把cookie信息、HTTP授权信息、客户端的SSL证书等发送到服务器端。可以如下设置:

objXMLHTTP.withCredentials&nbsp;=&nbsp;true;//允许ajax请求携带cookie信息

//服务器端,同样要做调整:
response.setHeader("Access-Control-Allow-Credentials","true");

注意: 1. 这里面,请求携带的是 服务器所在域名的cookie。例子中,就是 www.test.com (包括test.com)的cookie信息。
2. 如果服务端这时候设置了cookie,那么它是起作用的,默认挂在 www.test.com 域名下。
IE8+ 下的跨域对象:
IE8+ 支持一个XDomainRequest (XDR) 对象,用来进行跨域的ajax通信。
XDomainRequest 相比较普通的Ajax对象,有以下限制:
1. 不支持Cookie的发送和接收;
2. 除了 Content-type,不能设置其他请求头部;
3. 无法读写返回头部;
4. 仅支持 GET / POST 方法。(其它的方法的是?)


//http://shawn.test2.com/crossAjax.html
functioncreateXDR(){
varxdr=newXDomainRequest();
xdr.onload=function(){
alert(xdr.responseText);
};
xdr.onerror=function(){
alert("Anerroroccurred.");
};

//测试中,发现仅仅只能通过GET方式传值。
xdr.open("GET","http://www.test.com:8080/jsp/jsonie.jsp");

//IE8下报错
//xdr.contentType="application/x-www-form-urlencoded";

//
xdr.send();

//后端无法读取到POST的内容。不知道为何?
//xdr.send("userName=shawn");
}

//http://www.test.com:8080/jsp/jsonie.jsp
<%
response.setHeader("Access-Control-Allow-Origin","*");//allowall

Stringstr="";
str+="{";
str+="\"result\":1";
str+=",255);">总的来说,IE下出于安全的考虑,对于跨域的ajax限制很大,功能也弱。XDomainRequest也支持 progres、timeout等事件,更多内容可以参考MSDN.
参考资料:
https://developer.mozilla.org/en-US/docs/HTTP_access_control
http://msdn.microsoft.com/ZH-CN/library/cc288060
https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control
《javascript高级程序设计3》

关于跨域的ajax――Cross-Origin Resource Sharing (CORS)的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  3. ios – 如何在Swift中手动为UIWebView设置Cookie

    我需要在swift中为webview设置一个cookie.我找到了一个解决方案,但它是针对objective-c的.如何在Swift中做到这一点?

  4. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  5. 通过在iOS中处理cookie来维护会话信息

    我是iOS开发的新手.我正在使用NSURLSession来管理会话信息.下面是我用来调用任何服务器API的示例代码,我的申请流程是,如果没有登录–>登录(呼叫登录api)Else转到主屏幕并调用其他API.我的问题是,一旦从内存中删除应用程序,会话信息就不会被维护,我不得不再次调用Login.我的要求就像Facebook一样,用户只需登录一次,并且在下次应用程序启动时保持会话.编辑:我想我必须通过

  6. ios – 以http无效的自定义URL方案开头

    我在应用程序中使用了自定义URL方案.我成功地从safari重定向到我的应用程序.就像我已经制作了URL方案“appname”.请检查http://prntscr.com/2cjx0p.我需要使用像iosurlredirectfrommailtoapp这样的解决方案,但我不确定如何设置cookie.我发现我必须首先在我的应用程序中为服务器“http://myappname.com”设置一个cook

  7. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  8. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  9. ios – Watchkit新会话不起作用

    我的手表扩展中有两个视图控制器.每当我打电话时我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误WCSession在app和watch扩展中启动.任何建议?

  10. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部