跨域解決方案--CORS

JS跨域請求

這裏說的js跨域是指通過js在不同的域之間進行數據傳輸或通信,比如用ajax向一個不同的域請求數據,或者通過js獲取頁面中不同域的框架中(iframe)的數據。只要協議、域名、端口有任何一個不同,都被當作是不同的域。

跨域解決方案CORS

CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。CORS需要瀏覽器和服務器同時支持。目前,所有瀏覽器都支持該功能,IE瀏覽器不能低於IE10。
它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對於開發者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。因此,實現CORS通信的關鍵是服務器。只要服務器實現了CORS接口,就可以跨源通信。
請求過程如下圖:
在這裏插入圖片描述
Preflight Request:
在這裏插入圖片描述
然後服務器端給我們返回一個Preflight Response
在這裏插入圖片描述
具體實現很簡單,
1.在允許跨域請求的方法中加:

response.setHeader("Access-Control-Allow-Origin", "http://localhost:9105");
response.setHeader("Access-Control-Allow-Credentials", "true");

Access-Control-Allow-Origin
Access-Control-Allow-Origin是HTML5中定義的一種解決資源跨域的策略。
他是通過服務器端返回帶有Access-Control-Allow-Origin標識的Response header,用來解決資源的跨域權限問題。
使用方法,在response添加 Access-Control-Allow-Origin,例如

Access-Control-Allow-Origin:www.google.com

也可以設置爲 * 表示該資源誰都可以用
2.修改請求的js

	$http.get('http://localhost:9107/cart/addGoodsToCartList.do?itemId='
	+ $scope.sku.id +'&num='+$scope.num,{'withCredentials':true}).success(
			function(response){
				.......				 
			}				
	);	

調用測試,可以實現跨域了。
CORS請求默認不發送Cookie和HTTP認證信息。如果要把Cookie發到服務器,一方面要服務器同意,指定Access-Control-Allow-Credentials字段。另一方面,開發者必須在AJAX請求中打開withCredentials屬性。否則,即使服務器同意發送Cookie,瀏覽器也不會發送。或者,服務器要求設置Cookie,瀏覽器也不會處理。

SpringMVC跨域註解

springMVC的版本在4.2或以上版本,可以使用註解實現跨域, 我們只需要在需要跨域的方法上添加註解@CrossOrigin即可

@CrossOrigin(origins="http://localhost:9105",allowCredentials="true")

allowCredentials=“true” 可以缺省

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章