同源策略[same origin policy]是瀏覽器的乙個安全功能,不同源的客戶端指令碼在沒有明確授權的情況下,不能讀寫對方資源。 同源策略是瀏覽器安全的基石。
源[origin]就是協議、網域名稱和埠號。例如:這個url。
若位址裡面的協議、網域名稱和埠號均相同則屬於同源。
例如判斷下面的url
是否與 同源
頁面中的鏈結,重定向以及表單提交是不會受到同源策略限制的;
跨域資源的引入是可以的。但是js
不能讀寫載入的內容。如嵌入到頁面中的,
,
,
等。
受前面所講的瀏覽器同源策略的影響,不是同源的指令碼不能操作其他源下面的物件。想要操作另乙個源下的物件就需要跨域。 在同源策略的限制下,非同源的**之間不能傳送ajax
請求。對於非簡單請求,瀏覽器首先會發起乙個option預檢請求,詢問伺服器,當前網頁所在的網域名稱是否在伺服器的許可名單之中,以及可以使用哪些http動詞和頭資訊字段。只有得到肯定答覆,瀏覽器才會發出正式的xmlhttprequest請求,否則就報錯。
為了解決瀏覽器同源問題,w3c
提出了跨源資源共享,即cors
(cross-origin resource sharing)。
cors
做到了如下兩點:
基於這兩點,cors
將請求分為兩類:簡單請求和非簡單請求。
1、簡單請求
在cors
出現前,傳送http
請求時在頭資訊中不能包含任何自定義字段,且http
頭資訊不超過以下幾個字段:
乙個簡單的請求例子:
對於簡單請求,cors
的策略是請求時在請求頭中增加乙個origin
字段,伺服器收到請求後,根據該欄位判斷是否允許該請求訪問。
如果允許,則在 http 頭資訊中新增access-control-allow-origin
字段,並返回正確的結果 ;
如果不 允許,則不在 http 頭資訊中新增access-control-allow-origin
字段 。
除了上面提到的access-control-allow-origin
,還有幾個字段用於描述cors
返回結果 :
access-control-allow-credentials
: 可選,使用者是否可以傳送、處理cookie
;
access-control-expose-headers
:可選,可以讓使用者拿到的字段。有幾個字段無論設定與否都可以拿到的,包括:cache-control
、content-language
、content-type
、expires
、last-modified
、pragma
。
2、非簡單請求
對於非簡單請求的跨源請求,瀏覽器會在真實請求發出前,增加一次option
請求,稱為預檢請求(preflight request
)。預檢請求將真實請求的資訊,包括請求方法、自定義頭欄位、源資訊新增到 http 頭資訊欄位中,詢問伺服器是否允許這樣的操作。
例如乙個delete
請求:
請求使用的http
方法access-control-request-method
;
請求中包含的自定義頭欄位access-control-request-headers
。
伺服器收到請求時,需要分別對origin
、access-control-request-method
、access-control-request-headers
進行驗證,驗證通過後,會在返回http
頭資訊中新增 :
access-control-allow-origin:
access-control-allow-methods: get, post, put, delete
access-control-allow-headers: x-custom-header
access-control-allow-credentials: true
access-control-max-age: 1728000
他們的含義分別是:
access-control-allow-methods: 真實請求允許的方法
access-control-allow-headers: 伺服器允許使用的字段
access-control-allow-credentials: 是否允許使用者傳送、處理 cookie
access-control-max-age: 預檢請求的有效期,單位為秒。有效期內,不會重**送預檢請求
當預檢請求通過後,瀏覽器會傳送真實請求到伺服器。這就實現了跨源請求。
#
如果想要對某一介面配置cors
,可以在方法上新增@crossorigin
註解 :
@crossorigin(origins = )
public string greetings() ";
}
#
如果想對一系列介面新增 cors 配置,可以在類上新增註解,對該類宣告所有介面都有效:
@crossorigin(origins = )
@restcontroller
}
#
如果想新增全域性配置,則需要新增乙個配置類 :
options請求也會經過***,在進行登入攔截時候要注意特殊處理
@configuration
public class webmvcconfig extends webmvcconfigureradapter
}
另外,還可以通過新增 filter 的方式,配置 cors 規則,並手動指定對哪些介面有效。
@bean
public filterregistrationbean corsfilter()
無論是通過哪種方式配置cors
,其實都是在構造corsconfiguration
。 乙個cors
配置用乙個corsconfiguration
類來表示,它的定義如下:
public class corsconfiguration
spring
中對cors
規則的校驗,都是通過委託給defaultcorsprocessor
實現的。
defaultcorsprocessor
處理過程如下:
判斷依據是header
中是否包含origin
。如果包含則說明為cors
請求,轉到 2;否則,說明不是cors
請求,不作任何處理。
判斷response
的header
是否已經包含access-control-allow-origin
,如果包含,證明已經被處理過了, 轉到 3,否則不再處理。
判斷是否同源,如果是則轉交給負責該請求的類處理
是否配置了cors
規則,如果沒有配置,且是預檢請求,則拒絕該請求,如果沒有配置,且不是預檢請求,則交給負責該請求的類處理。如果配置了,則對該請求進行校驗。
校驗就是根據corsconfiguration
這個類的配置進行判斷:
判斷origin
是否合法
判斷method
是否合法
判斷header
是否合法
如果全部合法,則在response header
中新增響應的字段,並交給負責該請求的類處理,如果不合法,則拒絕該請求。
Tomcat 8 5 31版本下配置跨域CORS
這段 也是複製別人部落格上的 corsfilter org.apache.catalina.filters.corsfilter cors.allowed.origins cors.allowed.methods get,post,head,options,put cors.allowed.head...
SpringBoot常用配置
前言 springboot整合了主流的第三方框架,但是需要使用springboot那一套配置方式。但是我這裡只列舉了非常非常常用的,可以看已發的幾篇部落格,慢慢會補充。當然官方文件裡也有相應的配置,可惜沒有注釋。spring.resources.cache period 設定資源的快取時效,以秒為單...
Spring boot自動配置
1 從原始碼角度看spring boot 自動配置 這個方法呼叫的是 initialize sources suppresswarnings private void initialize object sources this.webenvironment deducewebenvironment...