關於禁用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="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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM