cors是乙個w3c標準,全稱是"跨域資源共享"(cross-origin resource sharing)。
它允許瀏覽器向跨源伺服器,發出xmlhttprequest
請求,從而克服了ajax只能同源使用的限制。
cors需要瀏覽器和伺服器同時支援。目前,所有瀏覽器都支援該功能,ie瀏覽器不能低於ie10。
瀏覽器會將ajax請求分為兩類,其處理方案略有差異:簡單請求、特殊請求。
簡單請求
只要同時滿足以下兩大條件,就屬於簡單請求。:
(1) 請求方法是以下三種方法之一:
(2)http的頭資訊不超出以下幾種字段:
當瀏覽器發現發現的ajax請求是簡單請求時,會在請求頭中攜帶乙個字段:origin
.origin中會指出當前請求屬於哪個域(協議+網域名稱+埠)。服務會根據這個值決定是否允許其跨域。
如果伺服器允許跨域,需要在返回的響應頭中攜帶下面資訊:
注意:如果跨域請求要想操作cookie,需要滿足3個條件:
特殊請求:
不符合簡單請求的條件,會被瀏覽器判定為特殊請求,,例如請求方式為put
預檢請求特殊請求會在正式通訊之前,增加一次http查詢請求,稱為"預檢"請求(preflight)。瀏覽器先詢問伺服器,當前網頁所在的網域名稱是否在伺服器的許可名單之中,以及可以使用哪些http動做和頭資訊字段。只有得到肯定答覆,瀏覽器才會發出正式的
xmlhttprequest
請求,否則就報錯。乙個「預檢」請求的樣板:
..與簡單請求相比,除了origin以外,多了兩個頭:
預檢請求的響應服務的收到預檢請求,如果許可跨域,會發出響應:除了
access-control-allow-origin
和access-control-allow-credentials
以外,這裡又額外多出3個頭:如果瀏覽器得到上述響應,則認定為可以跨域,後續就跟簡單請求的處理是一樣的了。
雖然原理比較複雜,但是前面說過:
在實現**我們需要 做的事情如下:
事實上,springmvc已經幫我們寫好了cors的跨域過濾器:corsfilter ,內部已經實現了剛才所講的判定邏輯,我們直接用就好了。1.新增cors的配置資訊
允許訪問的域
是否允許傳送cookie
允許的請求方式
允許的頭資訊
訪問有效期
2.新增對映路徑,我們攔截一切請求
3.返回新的corsfilter
在
ly-api-gateway
中編寫乙個配置類,並且註冊corsfilter:package com.leyou.gateway.config;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.web.cors.corsconfiguration;
import org.springframework.web.cors.urlbasedcorsconfigurationsource;
import org.springframework.web.filter.corsfilter;
@configuration
public
class
globalcorsconfig
}
跨域解決CORS
1.js跨域 js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向乙個不同的域請求資料,或者通過js獲取頁面中不同域的框架中 iframe 的資料。只要協議 網域名稱 埠有任何乙個不同,都被當作是不同的域。localhost 9000中的ajax 向localhost 9001中的...
cors解決跨域
cors是乙個w3c標準,全稱是 跨域資源共享 cross origin resource sharing 它允許瀏覽器向跨源伺服器,發出xmlhttprequest 請求,從而克服了ajax只能同源 使用的限制。cors需要瀏覽器和伺服器同時支援。目前,所有瀏覽器都支援該功能,ie瀏覽器不能低於i...
cors解決跨域問題
cors是乙個w3c標準,全稱是 跨域資源共享 cross origin resource sharing 它允許瀏覽器向跨源伺服器,發出xmlhttprequest請求,從而克服了ajax只能同源使用的限制。cors需要瀏覽器和伺服器同時支援。目前,所有瀏覽器都支援該功能,ie瀏覽器不能低於ie1...