|
|
@@ -47,16 +47,17 @@ public class JedisSessionDAO extends AbstractSessionDAO implements SessionDAO {
|
|
|
}
|
|
|
|
|
|
HttpServletRequest request = Servlets.getRequest();
|
|
|
+ boolean isSkipFullWrite = false;
|
|
|
if (request != null){
|
|
|
String uri = request.getServletPath();
|
|
|
// 如果是静态文件,则不更新SESSION
|
|
|
if (Servlets.isStaticFile(uri)){
|
|
|
return;
|
|
|
}
|
|
|
- // 如果是视图文件,则不更新SESSION
|
|
|
+ // 如果是视图文件,则跳过完整序列化写入,但仍需刷新Redis TTL
|
|
|
if (StringUtils.startsWith(uri, Global.getConfig("web.view.prefix"))
|
|
|
&& StringUtils.endsWith(uri, Global.getConfig("web.view.suffix"))){
|
|
|
- return;
|
|
|
+ isSkipFullWrite = true;
|
|
|
}
|
|
|
// 手动控制不更新SESSION
|
|
|
if (Global.NO.equals(request.getParameter("updateSession"))){
|
|
|
@@ -66,21 +67,23 @@ public class JedisSessionDAO extends AbstractSessionDAO implements SessionDAO {
|
|
|
|
|
|
Jedis jedis = null;
|
|
|
try {
|
|
|
-
|
|
|
jedis = JedisUtils.getResource();
|
|
|
+ String sessionKey = sessionKeyPrefix + session.getId();
|
|
|
|
|
|
- // 获取登录者编号
|
|
|
- PrincipalCollection pc = (PrincipalCollection)session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
|
|
|
- String principalId = pc != null ? pc.getPrimaryPrincipal().toString() : StringUtils.EMPTY;
|
|
|
-
|
|
|
- jedis.hset(sessionKeyPrefix, session.getId().toString(), principalId + "|" + session.getTimeout() + "|" + session.getLastAccessTime().getTime());
|
|
|
- jedis.set(JedisUtils.getBytesKey(sessionKeyPrefix + session.getId()), JedisUtils.toBytes(session));
|
|
|
+ if (!isSkipFullWrite) {
|
|
|
+ // 获取登录者编号
|
|
|
+ PrincipalCollection pc = (PrincipalCollection)session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
|
|
|
+ String principalId = pc != null ? pc.getPrimaryPrincipal().toString() : StringUtils.EMPTY;
|
|
|
+
|
|
|
+ jedis.hset(sessionKeyPrefix, session.getId().toString(), principalId + "|" + session.getTimeout() + "|" + session.getLastAccessTime().getTime());
|
|
|
+ jedis.set(JedisUtils.getBytesKey(sessionKey), JedisUtils.toBytes(session));
|
|
|
+ }
|
|
|
|
|
|
- // 设置超期时间
|
|
|
+ // 始终刷新Redis TTL,防止JSP请求时TTL不续期导致会话过期丢失
|
|
|
int timeoutSeconds = (int)(session.getTimeout() / 1000);
|
|
|
- jedis.expire((sessionKeyPrefix + session.getId()), timeoutSeconds);
|
|
|
+ jedis.expire(sessionKey, timeoutSeconds);
|
|
|
|
|
|
- logger.debug("update {} {}", session.getId(), request != null ? request.getRequestURI() : "");
|
|
|
+ logger.debug("update {} {} skipFullWrite={}", session.getId(), request != null ? request.getRequestURI() : "", isSkipFullWrite);
|
|
|
} catch (Exception e) {
|
|
|
logger.error("update {} {}", session.getId(), request != null ? request.getRequestURI() : "", e);
|
|
|
} finally {
|
|
|
@@ -237,10 +240,8 @@ public class JedisSessionDAO extends AbstractSessionDAO implements SessionDAO {
|
|
|
Jedis jedis = null;
|
|
|
try {
|
|
|
jedis = JedisUtils.getResource();
|
|
|
-// if (jedis.exists(sessionKeyPrefix + sessionId)){
|
|
|
- session = (Session)JedisUtils.toObject(jedis.get(
|
|
|
+ session = (Session)JedisUtils.toObject(jedis.get(
|
|
|
JedisUtils.getBytesKey(sessionKeyPrefix + sessionId)));
|
|
|
-// }
|
|
|
logger.debug("doReadSession {} {}", sessionId, request != null ? request.getRequestURI() : "");
|
|
|
} catch (Exception e) {
|
|
|
logger.error("doReadSession {} {}", sessionId, request != null ? request.getRequestURI() : "", e);
|
|
|
@@ -258,8 +259,13 @@ public class JedisSessionDAO extends AbstractSessionDAO implements SessionDAO {
|
|
|
@Override
|
|
|
public Session readSession(Serializable sessionId) throws UnknownSessionException {
|
|
|
try{
|
|
|
- return super.readSession(sessionId);
|
|
|
+ Session session = super.readSession(sessionId);
|
|
|
+ if (session == null) {
|
|
|
+ logger.warn("readSession returned null for sessionId={}, session may have been lost", sessionId);
|
|
|
+ }
|
|
|
+ return session;
|
|
|
}catch (UnknownSessionException e) {
|
|
|
+ logger.warn("readSession UnknownSessionException for sessionId={}", sessionId);
|
|
|
return null;
|
|
|
}
|
|
|
}
|