打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
我的shiro之旅: 十 自定义shiro的SessionIdCookie
userphoto

2015.11.13

关注

在使用shiro的时候,曾经有段时间很苦恼,因为我cookie的sessionId经常无故被改,然后抛There is no session with id [xxxx]的异常。我们知道,当请求过来,shiro创建session后,会把sessionId写回到客户端的cookie中。每二个请求过来时,shiro会拿到这个cookie里的sessionId去查找,如果查找不到,就有可能抛There is no session with id的异常。通过抛这个异常的会有两种情况,一种就是我刚才说的,cookie被改写了,因为shiro默认的cookie名叫JSESSIONID,当在web.xml里配置的请求拦截配得不合理时,就有可能被改写。在我的项目中,因为有些静态资源配置了不拦截,就会被容器改写了这个cookie。后来,干脆把cookie的名字改了,不再叫JSESSIONID。还有一种就是浏览器打开很久都没有操作,然后shiro定时清理了不活动的session,这时浏览器再发请求过来,因为session已被清理,也会抛There is no session with id。更改cookie的名字方法如下:

01   <bean id="shiroSessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
02    <property name="sessionDAO" ref="sessionDAO"/>
03    <!-- <property name="sessionValidationScheduler" ref="shiroSessionValidationScheduler"/> -->
04    <property name="sessionValidationInterval" value="1800000"/>  <!-- 相隔多久检查一次session的有效性 -->
05    <property name="globalSessionTimeout" value="1800000"/>  <!-- session 有效时间为半小时 (毫秒单位)-->
06    <property name="sessionIdCookie.domain" value=".xxx.com"/>
07    <property name="sessionIdCookie.name" value="jsid"/>
08    <property name="sessionIdCookie.path" value="/"/>
09    <!-- <property name="sessionListeners">
10        <list>
11            <bean class="com.concom.security.interfaces.listener.SessionListener"/>
12        </list>
13    </property> -->
14</bean>

我们打开shiro的DefaultWebSessionManager类源码就可以知道,里面有个private Cookie sessionIdCookie;属性,这个就是sessionId的cookie。在DefaultWebSessionManager的构造器里,初始化的名字取的是ShiroHttpSession.DEFAULT_SESSION_ID_NAME,也就是"JSESSIONID",在这里我们不去改源码,只要通过spring改sessionIdCookie的属性即可。

1public DefaultWebSessionManager() {
2        Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
3        cookie.setHttpOnly(true); //more secure, protects against XSS attacks
4        this.sessionIdCookie = cookie;
5        this.sessionIdCookieEnabled = true;
6    }


在上面的xml配置中,写了sessionIdCookie.domain的值为.xxx.com,这个根据自己的项目而定。这里配置为的是某域名及其二级域名都能共享这个cookie。还有sessionIdCookie.name,这个就是cookie的名字,值为jsid。这样我们就可以看到,cookie会多了一个名字jsid,值为当前session的id的键值。在上面还配置了两个关于session有效期的配置,一个是sessionValidationInterval,表示shiro的定时器多久去检查一次session的有效性,一个是globalSessionTimeout,表示session的有效时长。当然,我们也完全可以息定义定时器,把定时器注入到DefaultWebSessionManager的sessionValidationScheduler属性中,只是个人觉得没这个必要。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
apache shiro集群实现(一) session共享
Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案
shiro实现APP、web统一登录认证和权限管理
第十八章 并发登录人数控制
实战,通过复写shiro的SessionDAO来实现将session保存到redis集群中
登陆状态持久化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服