这里说的js跨域是指经过js在不一样的域之间进行数据传输或通讯,好比用ajax向一个不一样的域请求数据,或者经过js获取页面中不一样域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不一样,都被看成是不一样的域。html
一个工程经过js访问另外一个工程时,会报如下错误html5
XMLHttpRequest cannot loadajax
http://localhost:9107/cart/addGoodsToCartList.do?itemId=112344&num=1. spring
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9100' is therefore not allowed access. The response had HTTP status code 400.跨域
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。CORS须要浏览器和服务器同时支持。目前,全部浏览器都支持该功能,IE浏览器不能低于IE10。它容许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。整个CORS通讯过程,都是浏览器自动完成,不须要用户参与。对于开发者来讲,CORS通讯与同源的AJAX通讯没有差异,代码彻底同样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感受。所以,实现CORS通讯的关键是服务器。只要服务器实现了CORS接口,就能够跨源通讯。浏览器
请求过程以下图:服务器
Preflight Request:框架
而后服务器端给咱们返回一个Preflight Response测试
解决spa
(1) 在方法中添加如下代码
Access-Control-Allow-Origin
Access-Control-Allow-Origin是HTML5中定义的一种解决资源跨域的策略。
他是经过服务器端返回带有Access-Control-Allow-Origin标识的Response header,用来解决资源的跨域权限问题。
http://localhost:9105:表示容许跨域的资源,*表示全部资源都容许跨域
response.setHeader("Access-Control-Allow-Origin", "http://localhost:9105");
response.setHeader("Access-Control-Allow-Credentials", "true");
(2) 修改js的代码(angular.js)
$scope.addToCart=function(){ $http.get('http://localhost:9107/cart/addGoodsToCartList.do?itemId=' + $scope.sku.id +'&num='+$scope.num,{'withCredentials':true}).success( function(response){ ....... } ); }
SpringMVC跨域注解
springMVC的版本在4.2或以上版本,可使用注解实现跨域, 咱们只须要在须要跨域的方法上添加注解@CrossOrigin便可
PS:个人是JDK1.7,没成功,估计要JDK1.8以上吧,没去测试
@CrossOrigin(origins="http://localhost:9105",allowCredentials="true")
// response.setHeader("Access-Control-Allow-Origin", "http://localhost:9105");// response.setHeader("Access-Control-Allow-Credentials", "true");