shiro session丢失

之前遇到一个问题,用户登录之后存放在session通过Subject是那不到的,搞了2天才搞明白,下面看一下主要代码:
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
		<property name="name" value="JESSIONID" />
		<property name="path" value="/" />
</bean>
这个bean的作用是创建Cookie用的,在DefaultWebSessionManager中,使用到了这个<span style="font-family: Arial, Helvetica, sans-serif;">Cookie,需要把这个</span><span style="font-family: Arial, Helvetica, sans-serif;">sessionIdCookie注入到</span><span style="font-family: Arial, Helvetica, sans-serif;">DefaultWebSessionManager中,看代码:</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java"><!-- 会话管理器 -->
	<bean id="sessionManager"
		class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
		<property name="globalSessionTimeout" value="3600000" />
		<property name="deleteInvalidSessions" value="true" />
		<property name="sessionValidationSchedulerEnabled" value="true" />
		<property name="sessionValidationInterval" value="10000"/> 
		<property name="cacheManager" ref="shiroCacheManager" /> 
		<property name="sessionDAO" ref="sessionDAO" />
		<property name="sessionIdCookieEnabled" value="true" />
		<strong><property name="sessionIdCookie" ref="sessionIdCookie" /></strong>
		<property name="sessionListeners">
			<list>
				<ref bean="sessionListener" />
			</list>
		</property>
	</bean>
 看加粗的一行代码,再此注入,功能就完成了,但是为什么会找不到用户的存储在session的信息呢?
问题就在<span style="font-family: Arial, Helvetica, sans-serif;"><property name="name" value="JESSIONID" />这个value的值,看一下</span><span style="font-family: Arial, Helvetica, sans-serif;">DefaultWebSessionManager类中的代码:</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java"><pre name="code" class="java">    private Serializable getReferencedSessionId(ServletRequest request, ServletResponse response) {
        String id = this.getSessionIdCookieValue(request, response);
        if(id != null) {
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "cookie");
        } else {
            id = this.getUriPathSegmentParamValue(request, "JSESSIONID");
            if(id == null) {
                String name = this.getSessionIdName();
                id = request.getParameter(name);
                if(id == null) {
                    id = request.getParameter(name.toLowerCase());
                }
            }

            if(id != null) {
                request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "url");
            }
        }

        if(id != null) {
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
        }

        return id;
    }


 
看一下这个name,跟自己写的一样,问题就在这.每次创建一个cookie之后,创建的sessionId会添加到cookie中,然后每次请求都会将这个cookie的sessionid传回去进行验证,
如果容器在处理的时候出了问题,则会创建多个name为JSESSIONID的Session,这样就会把自己的session信息给覆盖了,所以解决办法很简单,将自己的Cookie的name改一下就可以了:

<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
		<property name="name" value="jsId" />
		<property name="path" value="/" />
</bean>



 

                
Shiro框架没有使用Tomcat的session,而是重新实现了一套自己的session机制。因此,当引入Shiro后,传统的Tomcat session共享机制将失效,必须采用面向Shirosession共享方式。 为了配置Shirosession共享,需要进行以下步骤: 1. 在shiro-web.ini配置文件中添加以下代码: ``` [main] sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager securityManager.sessionManager=$sessionManager ``` 这样可以创建一个DefaultSessionManager的实例,并将其设置为securityManager的sessionManager属性值。 2. 在shiro-web.ini配置文件中继续添加以下代码: ``` [main] sessionFactory=org.apache.shiro.session.mgt.OnlineSessionFactory sessionManager.sessionFactory=$sessionFactory ``` 这样可以创建一个OnlineSessionFactory的实例,并将其设置为sessionManager的sessionFactory属性值。 通过以上配置,你就可以实现Shirosession共享了。你也可以在网上找到更多关于Shiro session共享的文章来进一步学习和了解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于spring redis的shiro session共享](https://download.csdn.net/download/z0120409310507/9854349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Shiro学习(10)Session管理](https://blog.csdn.net/m0_67403073/article/details/126496325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值