填坑日记(三)shiro整合memcache问题

memcache 1.1.4

问题现象

启动Shiro整合memcache共享Session的项目,访问出现There is no session with id的问题

org.apache.shiro.session.UnknownSessionException: There is no session with id [6ec13a08-5ea9-488a-bbb3-0c9da209fb31]
 at org.apache.shiro.session.mgt.eis.AbstractSessionDAO.readSession(AbstractSessionDAO.java:170) ~[shiro-core-1.4.0.jar:1.4.0]
 at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSessionFromDataSource(DefaultSessionManager.java:236) ~[shiro-core-1.4.0.jar:1.4.0]
 at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSession(DefaultSessionManager.java:222) ~[shiro-core-1.4.0.jar:1.4.0]
 at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSessionManager.java:118) ~[shiro-core-1.4.0.jar:1.4.0]
 at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupSession(AbstractNativeSessionManager.java:148) ~[shiro-core-1.4.0.jar:1.4.0]
 at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupRequiredSession(AbstractNativeSessionManager.java:152) ~[shiro-core-1.4.0.jar:1.4.0]
 at org.apache.shiro.session.mgt.AbstractNativeSessionManager.setAttribute(AbstractNativeSessionManager.java:256) ~[shiro-core-1.4.0.jar:1.4.0]
 at org

问题排查一

由于项目是使用tomcat启动,因此查询相关资料,发现tomcat默认使用的SESSION参数名和shiro可能会冲突,需要修改参数。

但是查看代码发现,代码内已经是使用自定义参数名,因此不是这个问题引起的。



        SimpleCookie cookie = new SimpleCookie("sid");
        cookie.setHttpOnly(true);
        cookie.setMaxAge(-1);

   sessionManager.setSessionIdCookie(cookie);

问题排查二

跟踪代码发现,出现这个问题是通过memcache查询session时,session不存在导致的。

代码存放session,设置过期时间了,session怎么不存在?

存放代码如下:

private void saveSession(Session session) {
        if (session != null && session.getId() != null) {
           Date date = new Date();
           date.setTime(date.getTime() + 1440 * 60 * 1000);
           memCachedClient.set(session.getId().toString(),session,date);
        }
    }

进行查询memcache服务的时间,原来memcache 1.4.4版本的服务时间为1981年,因此导致只要一存放session立马就过期了。

解决办法

升级memcache版本为1.4.5即可解决该问题

上一篇:shiro授权


下一篇:spring boot shiro+session+redis 实现登录会话、会话保持、分布式session共享