AJAX POST&跨域 解决方案 - CORS
好了,下面进入实战,直接说说使用方法。 1 var xhr = new XMLHttpRequest(); 2 xhr.open("POST","http://www.b.com",true); 3 xhr.send(); 没有看错!就是这么简单! 和Ajax的调用方法是毫无差异的,需要的只是服务器端的配合。
服务器端如何配置? PHP:只需要使用如下的代码设置即可。 1 <?php
2 header("Access-Control-Allow-Origin:*");
以上的配置的含义是允许任何域发起的请求都可以获取当前服务器的数据。 当然,这样有很大的危险性,恶意站点可能通过XSS攻击我们的服务器。 如果仅支持www.a.com这个站跨域访问,那就: header("Access-Control-Allow-Origin: http://www.a.com");
这样就基本配置ok了~
前端的部分,如果需要跨域向服务器发cookies 还需要设置一个属性:withCredentials 3 xhr.withCredentials = true; //支持跨域发送cookies
4 xhr.send();
当然,服务器端也要设置 1 <?php
2 header("Access-Control-Allow-Credentials: true");
好吧,下面说说需要注意的地方。 如果不使用第三方库,用原生javascript来写,还是有些地方需要注意的。
1、不要设置X-Requested-With头 因为跨域访问,如需带header,服务器端必须要allow,不然报错。 setRequestHeader("X-Requested-With","XMLHttpRequest")主要用在Ajax调用资源时,服务器能判断该次请求是Ajax的。
2、INVALID_STATE_ERR: DOM Exception 11 这是一个神奇的错误,网上找了一下,也没什么较为明确的答复。但我却在手机端遇到了这个问题! 测试了一下:在IOS4和IOS5的UC浏览器、Safari、Chrome,进行CORS访问均会报这个错, Android4.0原生浏览器,也无法正常CORS(没有测试2.3和2.2) 估计也是报这个错,但没控制台,所以无法查bug。 Android4.0下的Chrome和UC都可以顺利CORS。 本以为是浏览器兼容的问题,经过蛋疼的排查之后,发现... 我们可以看一下,下面两段代码有啥差异? 2 xhr.withCredentials = 3 xhr.open("POST","http://weibo.com/demo/b/index.php",128); line-height:1.5!important">4 xhr.send();
4 xhr.send();
唯一的差异就是xhr.withCredentials = true; 的位置。 但就是这个差别,导致第一段代码无法顺利在手机端运行,并报INVALID_STATE_ERR: DOM Exception 11这个错! 而在桌面版浏览器下,两段代码都可以顺利运行! 所以,以后设置withCredentials属性时,一定要在open方法之后!
正常使用AJAX会需要正常考虑跨域问题,所以伟大的程序员们又折腾出了一系列跨域问题的解决方案,如JSONP、flash、ifame、xhr2等等。
本文介绍的CORS就是一套AJAX跨域问题的解决方案。
CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。
喜闻乐见、普大喜奔的支持情况,尤其是在
移动终端上,除了opera Mini;
PC上的现代浏览器都能友好的支持,除了IE9-,不过前端工程师对这种情况早应该习惯了...
CORS启航
假设我们页面或者应用已在
http://www.test1.com上了,而我们打算从
http://www.test2.com请求提取数据。一般情况下,如果我们直接使用 AJAX 来请求将会失败,浏览器也会返回“源不匹配”的错误,"
跨域"也就以此由来。
利用 CORS,
http://www.test2.com只需添加一个标头,就可以允许来自
http://www.test1.com的请求,下图是我在PHP中的 hander() 设置,
“*”号表示允许任何域向我们的服务端提交请求:
当前我设置的header为“*”,任意一个请求过来之后服务端我们都可以进行处理&响应,那么在调试工具中可以看到其头信息设置,其中见红框中有一项信息是“
Access-Control-Allow-Origin:*”,表示我们已经启用CORS,如下图。
PS:
由于demo都在我厂的两台测试机间完成,外网也不能访问,所以在这就不提供demo了,见谅
简单的一个header设置,一个支持跨域&POST请求的server就完成了:)
当然,如果没有开启CORS必定失败的啦,如下图:
问题&小结
自认为的cors使用场景:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |