关于禁用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

 

posted @ 2020-09-11 11:09  ryelqy  阅读(1002)  评论(0编辑  收藏  举报