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都是可以设置有效期的,此处就不再多说了,直接上配置文件

<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <!--以下都是默认配置-->
        <property name="httpOnly" value="true"></property>
        <!-- -1:有效期为一个会话,单位为秒-->
        <property name="maxAge" value="-1"></property>

        <property name="name" value="sessionIdCookie"></property>
    </bean>

  <!-- sessionIdCookie:客户端用来存放sessionId的cookie
       key:sessionIdCookie
       value:sessionId
  -->


    <bean id="sessionDao" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO"></bean>

    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- session超时时间,单位毫秒 -->
        <property name="globalSessionTimeout" value="180000"></property>
        <property name="sessionDAO" ref="sessionDao"></property>
        <!-- session有效性检测器,默认是开启的,单位毫秒,3分钟检测一次,并将过期的sesion删除(默认配置)-->
        <property name="sessionValidationInterval" value="300000"></property>
        <property name="sessionIdCookie" ref="sessionIdCookie"></property>
        <property name="sessionListeners">
            <list>
                <bean class="com.ssm.util.MySessionListener"></bean>
            </list>
        </property>
    </bean>

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

public DefaultWebSessionManager() {
        Cookie cookie = new SimpleCookie("JSESSIONID");
        cookie.setHttpOnly(true);
        this.sessionIdCookie = cookie;
        this.sessionIdCookieEnabled = true;
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值