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即可解决该问题