1. 程式人生 > 實用技巧 >關於禁用cookie後無法使用session的解決方案

關於禁用cookie後無法使用session的解決方案

一、Session簡單介紹

客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以類似於散列表的形式記錄在伺服器上,這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查詢該客戶的狀態就可以了。[1]

當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識(稱為session id),如果已包含則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應中返回給客戶端儲存[2]

一般情況下,伺服器通過回寫cookie的方式,將sessionid存放到瀏覽器中,從而每次訪問都可找到session資料。如果使用者禁用了瀏覽器cookie功能,那麼session的功能也無法發揮作用,這個時候可以通過在url中或者提交的資料引數中附帶sessionId的方法來恢復session功能。

二、sessionid的獲取方式

可以通過js非同步訪問伺服器獲取sessionid,儲存到js變數中。在之後如果需要訪問後臺,可通過js操作,將sessionid加入到url中或者加入到表單資料中。

前臺程式碼:

<button type="button" onclick="getSession()">獲取session</button>

/*
* thymeleaf模板相對路徑 **/ /*<![CDATA[*/ ctxPath = /*[[@{/}]]*/ ''; /*]]>*/ function getSession(){ $.post(ctxPath + "/getSession", {}, function(data){ let sessionId = data.sessionId; console.log(sessionId); }); }

後臺程式碼:

    /**
     * 獲取session
     * 
@param session * @return */ @RequestMapping("/getSession") @ResponseBody public Map<String, Object> getSession(HttpSession session){ Map<String, Object> map = new HashMap<>(); map.put("sessionId", session.getId()); return map; }

效果:

三、獲取sessionid後使用舉例[3]

Reference:

[1] mayiwoaini, Session詳解, https://www.jianshu.com/p/4452cd4c4783
[2] 程式設計師小新人學習, Cookies和Session的區別和理解, https://developer.51cto.com/art/201809/583768.htm
[3] cecelia, cookie被禁用,如何使用session, https://www.cnblogs.com/ceceliahappycoding/p/10544075.html