• Shiro中的session和cookie


    Shiro中的session和cookie
    最近项目在整合Shiro框架,顺便深入学习了Shiro的session和cookie。
    HTTP协议是无状态的,所以在web项目中一般都是通过session和cookie来保持浏览器和服务器之间的会话的。
    shiro也是如此,当浏览器第一次请求服务器时,服务器会生成一个session,同时创建cookie,将sessionId保存在cookie中,cookie再作为响应头返回到浏览器并保存。这也就是我们常说的“cookie保存在客户端,session保存在服务器端”。
    Debug查看DefaultWebSessionManager源码:
    1.第一次请求服务器,session创建,触发onStart()方法,获取当前session的sessionId,并调用storeSessionId()方法
    在这里插入图片描述

    2.在storeSessionId()方法中创建cookie,并set值sessionId在这里插入图片描述
    3.在saveTo()方法中,获取cookie相关信息,调用addcookieHeader()方法,将cookie值作为响应头返回浏览器。
    在这里插入图片描述
    在这里插入图片描述
    4.此时我们在浏览器看下保存的cookie值,和服务端session的sessionid时一样的
    在这里插入图片描述
    5.此后我们每向服务器发送请求,都会带着sessionId,服务端通过sesssionId寻找是否存在有效的session,来进行会话保持。当服务端session过期或者当前会话结束(关闭浏览器),都会因sessionId丢失或者session过期被清除,找不到关联的session而导致会话中断。

    shiro中的session和保存sessionId的cookie都是可以设置有效期的,此处就不再多说了,直接上配置文件

    
            
            
            
            
    
            
        
    
      
    
    
        
    
        
            
            
            
            
            
            
            
                
                    
                
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    cookie都是key-value类型的,key的值是可以改变的,这点看下源码就可以知道,存储sessionid的cookie的key的值默认为JSESSIONID.

    public DefaultWebSessionManager() {
            Cookie cookie = new SimpleCookie("JSESSIONID");
            cookie.setHttpOnly(true);
            this.sessionIdCookie = cookie;
            this.sessionIdCookieEnabled = true;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意:在使用SessionListenerAdapter来监听session生命周期时,onStart()方法不能作为用户登陆日志的开始时间节点,因为session的创建是在第一次请求服务器创建的,而不是用户登陆时创建的,所以不要搞混;并且onExpiration()方法属于被动的方法,当session过期后,如果你不主动发一次请求或者session检测器检测,是不会触发这个方法的。

  • 相关阅读:
    Java基础总结
    Python Prim 算法 生成迷宫
    基于javaweb的云南普洱茶管理系统+茶叶网站+在线购买系统(前端+后端)
    ElasticSearch-head前端安装以及连接ES基本步骤(linux)
    【freeRTOS】操作系统之六-低功耗模式
    macOS Big Sur(macos11版本)
    52 杨辉三角
    ARM 按键按下灯状态取反
    【目标检测】41、CSPNet | 一种加强 CNN 模型学习能力的主干网络
    美国零售电商平台Target,值得入驻吗?如何入驻?
  • 原文地址:https://blog.csdn.net/m0_67265464/article/details/126496228