一、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="getSessionId()">獲取session</button> /** thymeleaf模板相對路徑 **/ /*<![CDATA[*/ ctxPath = /*[[@{/}]]*/ ''; /*]]>*/ function getSessionId(){ $.post(ctxPath + "/getSessionId", {}, function(data){ let sessionId = data.sessionId; console.log(sessionId); }); }
后台代碼:
/** * 獲取sessionId * @param session * @return */ @RequestMapping("/getSessionId") @ResponseBody public Map<String, Object> getSessionId(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