|
|
|
@ -16,9 +16,12 @@
|
|
|
|
|
package org.redisson.tomcat;
|
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Map.Entry;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
|
|
import org.apache.catalina.session.StandardSession;
|
|
|
|
@ -35,6 +38,16 @@ import org.redisson.tomcat.RedissonSessionManager.UpdateMode;
|
|
|
|
|
*/
|
|
|
|
|
public class RedissonSession extends StandardSession {
|
|
|
|
|
|
|
|
|
|
private static final String IS_NEW_ATTR = "session:isNew";
|
|
|
|
|
private static final String IS_VALID_ATTR = "session:isValid";
|
|
|
|
|
private static final String THIS_ACCESSED_TIME_ATTR = "session:thisAccessedTime";
|
|
|
|
|
private static final String MAX_INACTIVE_INTERVAL_ATTR = "session:maxInactiveInterval";
|
|
|
|
|
private static final String LAST_ACCESSED_TIME_ATTR = "session:lastAccessedTime";
|
|
|
|
|
private static final String CREATION_TIME_ATTR = "session:creationTime";
|
|
|
|
|
|
|
|
|
|
public static final Set<String> ATTRS = new HashSet<String>(Arrays.asList(IS_NEW_ATTR, IS_VALID_ATTR,
|
|
|
|
|
THIS_ACCESSED_TIME_ATTR, MAX_INACTIVE_INTERVAL_ATTR, LAST_ACCESSED_TIME_ATTR, CREATION_TIME_ATTR));
|
|
|
|
|
|
|
|
|
|
private final RedissonSessionManager redissonManager;
|
|
|
|
|
private final Map<String, Object> attrs;
|
|
|
|
|
private RMap<String, Object> map;
|
|
|
|
@ -88,9 +101,9 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
|
|
|
|
|
if (map != null) {
|
|
|
|
|
Map<String, Object> newMap = new HashMap<String, Object>(3);
|
|
|
|
|
newMap.put("session:creationTime", creationTime);
|
|
|
|
|
newMap.put("session:lastAccessedTime", lastAccessedTime);
|
|
|
|
|
newMap.put("session:thisAccessedTime", thisAccessedTime);
|
|
|
|
|
newMap.put(CREATION_TIME_ATTR, creationTime);
|
|
|
|
|
newMap.put(LAST_ACCESSED_TIME_ATTR, lastAccessedTime);
|
|
|
|
|
newMap.put(THIS_ACCESSED_TIME_ATTR, thisAccessedTime);
|
|
|
|
|
map.putAll(newMap);
|
|
|
|
|
if (readMode == ReadMode.MEMORY) {
|
|
|
|
|
topic.publish(createPutAllMessage(newMap));
|
|
|
|
@ -104,8 +117,8 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
|
|
|
|
|
if (map != null) {
|
|
|
|
|
Map<String, Object> newMap = new HashMap<String, Object>(2);
|
|
|
|
|
newMap.put("session:lastAccessedTime", lastAccessedTime);
|
|
|
|
|
newMap.put("session:thisAccessedTime", thisAccessedTime);
|
|
|
|
|
newMap.put(LAST_ACCESSED_TIME_ATTR, lastAccessedTime);
|
|
|
|
|
newMap.put(THIS_ACCESSED_TIME_ATTR, thisAccessedTime);
|
|
|
|
|
map.putAll(newMap);
|
|
|
|
|
if (readMode == ReadMode.MEMORY) {
|
|
|
|
|
topic.publish(createPutAllMessage(newMap));
|
|
|
|
@ -115,7 +128,7 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected AttributesPutAllMessage createPutAllMessage(Map<String, Object> newMap) {
|
|
|
|
|
Map<String, Object> map = new HashMap<String, Object>();
|
|
|
|
|
for (Entry<String, Object> entry : newMap.entrySet()) {
|
|
|
|
@ -129,13 +142,13 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
super.setMaxInactiveInterval(interval);
|
|
|
|
|
|
|
|
|
|
if (map != null) {
|
|
|
|
|
fastPut("session:maxInactiveInterval", maxInactiveInterval);
|
|
|
|
|
fastPut(MAX_INACTIVE_INTERVAL_ATTR, maxInactiveInterval);
|
|
|
|
|
if (maxInactiveInterval >= 0) {
|
|
|
|
|
map.expire(getMaxInactiveInterval(), TimeUnit.SECONDS);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void fastPut(String name, Object value) {
|
|
|
|
|
map.fastPut(name, value);
|
|
|
|
|
if (readMode == ReadMode.MEMORY) {
|
|
|
|
@ -151,8 +164,8 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
if (!isValid && !map.isExists()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fastPut("session:isValid", isValid);
|
|
|
|
|
|
|
|
|
|
fastPut(IS_VALID_ATTR, isValid);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -161,7 +174,7 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
super.setNew(isNew);
|
|
|
|
|
|
|
|
|
|
if (map != null) {
|
|
|
|
|
fastPut("session:isNew", isNew);
|
|
|
|
|
fastPut(IS_NEW_ATTR, isNew);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -171,7 +184,7 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
super.endAccess();
|
|
|
|
|
|
|
|
|
|
if (isNew != oldValue) {
|
|
|
|
|
fastPut("session:isNew", isNew);
|
|
|
|
|
fastPut(IS_NEW_ATTR, isNew);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -206,12 +219,12 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
|
|
|
|
|
public void save() {
|
|
|
|
|
Map<String, Object> newMap = new HashMap<String, Object>();
|
|
|
|
|
newMap.put("session:creationTime", creationTime);
|
|
|
|
|
newMap.put("session:lastAccessedTime", lastAccessedTime);
|
|
|
|
|
newMap.put("session:thisAccessedTime", thisAccessedTime);
|
|
|
|
|
newMap.put("session:maxInactiveInterval", maxInactiveInterval);
|
|
|
|
|
newMap.put("session:isValid", isValid);
|
|
|
|
|
newMap.put("session:isNew", isNew);
|
|
|
|
|
newMap.put(CREATION_TIME_ATTR, creationTime);
|
|
|
|
|
newMap.put(LAST_ACCESSED_TIME_ATTR, lastAccessedTime);
|
|
|
|
|
newMap.put(THIS_ACCESSED_TIME_ATTR, thisAccessedTime);
|
|
|
|
|
newMap.put(MAX_INACTIVE_INTERVAL_ATTR, maxInactiveInterval);
|
|
|
|
|
newMap.put(IS_VALID_ATTR, isValid);
|
|
|
|
|
newMap.put(IS_NEW_ATTR, isNew);
|
|
|
|
|
|
|
|
|
|
if (attrs != null) {
|
|
|
|
|
for (Entry<String, Object> entry : attrs.entrySet()) {
|
|
|
|
@ -230,27 +243,27 @@ public class RedissonSession extends StandardSession {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void load(Map<String, Object> attrs) {
|
|
|
|
|
Long creationTime = (Long) attrs.remove("session:creationTime");
|
|
|
|
|
Long creationTime = (Long) attrs.remove(CREATION_TIME_ATTR);
|
|
|
|
|
if (creationTime != null) {
|
|
|
|
|
this.creationTime = creationTime;
|
|
|
|
|
}
|
|
|
|
|
Long lastAccessedTime = (Long) attrs.remove("session:lastAccessedTime");
|
|
|
|
|
Long lastAccessedTime = (Long) attrs.remove(LAST_ACCESSED_TIME_ATTR);
|
|
|
|
|
if (lastAccessedTime != null) {
|
|
|
|
|
this.lastAccessedTime = lastAccessedTime;
|
|
|
|
|
}
|
|
|
|
|
Integer maxInactiveInterval = (Integer) attrs.remove("session:maxInactiveInterval");
|
|
|
|
|
Integer maxInactiveInterval = (Integer) attrs.remove(MAX_INACTIVE_INTERVAL_ATTR);
|
|
|
|
|
if (maxInactiveInterval != null) {
|
|
|
|
|
this.maxInactiveInterval = maxInactiveInterval;
|
|
|
|
|
}
|
|
|
|
|
Long thisAccessedTime = (Long) attrs.remove("session:thisAccessedTime");
|
|
|
|
|
Long thisAccessedTime = (Long) attrs.remove(THIS_ACCESSED_TIME_ATTR);
|
|
|
|
|
if (thisAccessedTime != null) {
|
|
|
|
|
this.thisAccessedTime = thisAccessedTime;
|
|
|
|
|
}
|
|
|
|
|
Boolean isValid = (Boolean) attrs.remove("session:isValid");
|
|
|
|
|
Boolean isValid = (Boolean) attrs.remove(IS_VALID_ATTR);
|
|
|
|
|
if (isValid != null) {
|
|
|
|
|
this.isValid = isValid;
|
|
|
|
|
}
|
|
|
|
|
Boolean isNew = (Boolean) attrs.remove("session:isNew");
|
|
|
|
|
Boolean isNew = (Boolean) attrs.remove(IS_NEW_ATTR);
|
|
|
|
|
if (isNew != null) {
|
|
|
|
|
this.isNew = isNew;
|
|
|
|
|
}
|
|
|
|
|