JS跨域請求之CORS

  這裏說的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

  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-OriginHTML5中定義的一種解決資源跨域的策略。

  他是經過服務器端返回帶有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");
相關文章
相關標籤/搜索