項目情況:
spring boot 和spring session 版本都是 2.0.2.RELEASE
問題描述:
請求項目接口後瀏覽器保存的sessionId與服務器不一致,拿Postman測試如下圖,網上找了很久都沒發現有人發過這個問題,只能自己去找了spring session的深入分析一系列文章以及閱讀源碼,最後結合到今天找到的一個帖子,不過他裏面處理的比較複雜,我就做了個最簡單的處理。
分析:
這裏兩個session其實是一致的,只是瀏覽器保存的sessionId是經過服務器base64編碼之後返回的。其實看似不一致,但是前端傳入這個編碼後的服務器也會解碼處理,不會出現找不到的情況。以上這些東西我們可以在spring session 源碼 DefaultCookieSerializer 類中看到
我們可以看到這個類在初始化的時候就指定了使用base64編碼,指定cookie名稱爲session(這也是爲什麼使用spring session後cookie裏保存的不叫 jsessionid 而是叫session了)
而在寫cookie和讀cookie的時候,都會判斷類裏這個變量 useBase64Encoding 是否爲true,如果是,則寫的時候進行base64編碼,讀的時候進行base64解碼。
解決方案:
如果希望服務器與瀏覽器的sessionId一模一樣,只需要自己去註冊這個bean並且設置變量 useBase64Encoding 爲false即可
@Bean
public DefaultCookieSerializer getDefaultCookieSerializer(){
DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
defaultCookieSerializer.setUseBase64Encoding(false);
return defaultCookieSerializer;
}
參考: