Spring Boot+AngularJS中因為跨域導致Session丟失

大浪中航行發表於2016-09-06

如果還在為跨域問題煩惱,請檢視博主的 解決angular+spring boot的跨域問題 那篇文章。

博主在專案開發過程中,遇到了由於跨域而導致的Session丟失問題,非常的噁心,但是經過在網上查閱各種資料,發現解決方法十分簡單。

在我們每一次的資料請求中,瀏覽器都會向後臺傳送一個JSession,後臺會根據這個值自動查詢Id為JSession的那個session物件。但是當跨域時,JSession的值每次都會改變,後臺就會以為是新的一個會話開啟,於是又去建立了一個新的Session物件,而原來的Session物件就找不到了。

解決這個問題的方法很簡單

首先在Angular請求中將withCredentials設為true,然後每次請求的頭中就會帶有cookie的值,cookie中就記錄了JSession值,因此Session就不會丟失了。

在AngularJS中,可以通過全域性設定,使得withCredentials為true

var utils = angular.module('Utils', []);
    utils.config(['$httpProvider', config]);
    function config($httpProvider) {
            $httpProvider.defaults.withCredentials = true;
    }

然後讓在所有的app中都注入'Utils',就會將所有的請求頭中的withCredentials設定為true,這樣Session就不會丟失啦。

當然也可以通過以下方法來設定當前請求的withCredentials。

$http.xhr.withCredentials

然後在後臺也開啟.withCredentials

@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true)//就是這個啦
                .allowedMethods("GET", "POST", "DELETE", "PUT")
                .maxAge(3600);
    }

}

那麼.withCredentials是幹嘛的呢?

它需要前後端一起開啟,開啟之後就能夠讀寫瀏覽器的Cookies,但是這個Cookies是完全由你要請求站點控制的,我們無法通過js去獲取或改變Cookies中的值。


相關文章