Shiro源码分析之两种Session的方式

本文深入分析了Shiro中两种Session管理方式。第一种是默认的ServletContainerSessionManager,它依赖于容器的HttpSession。第二种是通过EnterpriseCacheSessionDAO,实现与容器无关的Session管理,利用缓存进行Session存储。详细阐述了Session的创建、存储和读取过程,并介绍了相关关键类和方法的作用。
摘要由CSDN通过智能技术生成

1Shiro默认的Session处理方式

 <!-- 定义 Shiro 主要业务对象 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!-- <property name="sessionManager" ref="sessionManager" /> -->
        <property name="realm" ref="systemAuthorizingRealm" />
        <property name="cacheManager" ref="shiroCacheManager" />
    </bean>

这里从DefaultWebSecurityManager这里看起,这个代码是定义的Shiro安全管理对象,看下面的构造方法(代码 1-1

(代码 1-1

public DefaultWebSecurityManager() {
       
        super();
        ((DefaultSubjectDAO) this.subjectDAO).setSessionStorageEvaluator(new DefaultWebSessionStorageEvaluator());
        this.sessionMode = HTTP_SESSION_MODE;
        setSubjectFactory(new DefaultWebSubjectFactory());
        setRememberMeManager(new CookieRememberMeManager());
        setSessionManager(new ServletContainerSessionManager());
    }



从 构造方法里面可以看出,这里面有 publicvoid setRememberMeManager(RememberMeManager rememberMeManager) publicvoid setSessionManager(SessionManager sessionManager)两个方法。这两个分别是对ShiroremembereMe功能和Session功能的管理。其中在构造方法里面可以看到,其实一开是就设置了SessionManager,就是默认的:ServletContainerSessionManager().接下来看看默认的ServletContainerSessionManager()是怎么玩转Session.看下图。这个图显示了这个类的这些个方法



这个类通过getSession(SessionKey)获得Sesison,下面看看这个方法干了些什么(代码1-2

(代码1-2

publicSession getSession(SessionKey key) throws SessionException {

        if (!WebUtils.isHttp(key)) { //判断是不是httpkey,否则抛异常
            String msg = "SessionKey must be an HTTP compatible implementation.";
            throw new IllegalArgumentException(msg);
        }
        HttpServletRequest request = WebUtils.getHttpRequest(key); //通过工具类获得HttpServletRequest 这类是javax.servlet.http.HttpServletRequest;
        Session session = null;
        HttpSession httpSession = request.getSession(false);//先从request里获得本来存在的
        if (httpSession != null) {
       
            session = createSession(httpSession, request.getRemoteHost());//如果不为空,就创建一个封装了的,为空就不管它
        }
        return session;
    }
    

可以看看注释,注释上都写好了,这里的意思是,首先判断封装好的Key是不是Httpkey,如果是就继续,不是就抛异常.key这个是带了ServletRequestServletResponseWebSessinKey,具体怎么new出来的,看DefaultWebSecurityManager的这方法代码就知道了<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值