在談先後分離前,咱們先看看什麼是先後一體的.當咱們用javaweb開發網站時,最終咱們渲染的jsp或者springthymeleaf.咱們的頁面實際上是WEB-INFO或者templates下.當用戶請求咱們的xxx頁面資源其實並非請求的真正的頁面,而是通過咱們controller處理完,產生modelAndView後,在找到視圖解析器,最終把數據放到視圖中,而後response才把視圖經過流傳輸給客戶端.在這種開發環境中,咱們請求的頁面實際是在web容器中的,天然是本域訪問.html
若是咱們將html文件整個挪出去,而後經過ajax方式訪問咱們的controller,此時controller和html並不在一個環境中,就產生了跨域訪問.在產生跨域訪問時,瀏覽器的請求順序是 1向服務端發起一個options類型的請求,這個請求則是向服務端發出疑問,你容許我訪問嗎?這個疑問包含的條件有,客戶端請求頭,客戶端地址,客戶端請求方式,等等.若是服務端容許客戶端的這些條件,則告訴客戶端瀏覽器,你能夠發出真正的請求了.這時瀏覽器纔會發送真正的請求.java
那麼接下來咱們來看服務端配置,也就是入棧規則了.ios
這麼配置算是萬無一失,前提是,你的客戶端不傳遞cookie.web
作javaweb開發的朋友們都知道,java中對於每個客戶有一個session.而session是根據cookie中的JSESSION來甄別身份的.ajax
若是是先後一體的項目,則每一個請求都會默認帶上cookie,但若是是先後分離則不會每次都攜帶cookie.這時咱們須要在客戶端進行配置spring
我這裏使用的是axios插件axios
這時則會每次攜帶cookie,可是這並沒結束.若是客戶端要攜帶cookie,那服務端跨域
必須明確指定放行的客戶端域名.這其實也是一個保護措施,試想,若是服務端容許每個陌生的客戶端訪問,那麼萬一有壞蛋經過攜帶大量cookie來搞服務端,又當如何.瀏覽器
至此,先後分離所帶來的跨域訪問和cookie攜帶問題就搞定了.cookie