跨域是指从一个域名的网页去请求另外一个域名的资源。浏览器出于安全的考虑,不容许不一样源的请求:javascript
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它容许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS须要浏览器和服务器同时支持。目前,全部浏览器都支持该功能,IE浏览器不能低于IE10。 java
整个CORS通讯过程,都是浏览器自动完成,不须要用户参与。对于开发者来讲,CORS通讯与同源的AJAX通讯没有差异,代码彻底同样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感受。
所以,实现CORS通讯的关键是服务器。只要服务器实现了CORS接口,就能够跨源通讯。jquery
Nginx设置ajax
add_header 'Access-Control-Max-Age' 86400; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE,PUT; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
对于IE8/9 须要使用jquery.xdomainrequest.min.js,而且添加相应header:json
proxy_set_header 'Content-Type' 'application/json; charset=utf-8';
而且设置:后端
JQuery.support.cors = true;
JSONP和JSON好像啊,他们之间有什么联系吗? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。对于JSON你们应该是很了解了吧,不是很清楚的朋友能够去json.org上了解下,简单易懂。 JSONP是JSON with Padding的略称。它是一个非官方的协议,它容许在服务器端集成Script tags返回至客户端,经过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)
JS例子:跨域
<script type="text/javascript"> $.ajax({ url:"http://localhost:20002/MyService.ashx?callback=?", dataType:"jsonp", jsonpCallback:"person", success:function(data){ alert(data.name + " is a a" + data.sex); } }); </script>
Java端:浏览器
@RequestMapping(value = "/test", method = RequestMethod.GET) public @ResponseBody JSONPObject test(HttpServletResponse response, String callback) { Map<String, String> map = new HashMap<String, String>(); map.put("aaa", "I'm Dreamlu!"); return new JSONPObject(callback, map); //hellojsonp({"aaa":"I'm Dreamlu!"}) }
注意:JSONP须要服务端支持,不能简单的配置Nginx实现安全
经过把非同源请求用同源代理的方式来饶过跨域限制。 proxy_pass http://xxxxx/xxx.do