shiro Session管理
- SessionManager,SessionDAO
- Redis实现Session共享
- Redis实现Session共享存在的问题
public class RedisSessionDao extends AbstractSessionDAO {
@Resource
private JedisUtil jedisUtil;
private final String SHIRO_SESSION_PREFIX = "czj";
protected Serializable doCreate(Session session) {
System.out.println("create session");
Serializable sessionId = generateSessionId(session);
assignSessionId(session,sessionId);
saveSession(session);
return sessionId;
}
protected Session doReadSession(Serializable sessionId) {
System.out.println("read session");
if(sessionId == null){
return null;
}
byte[] key = getKey(sessionId.toString());
byte[] value = jedisUtil.get(key);
return (Session) SerializationUtils.deserialize(value);
}
public void update(Session session) throws UnknownSessionException {
System.out.println("update session");
if(session != null && session.getId() != null){
saveSession(session);
}
}
public void delete(Session session) {
System.out.println("delete session");
if(session != null && session.getId() != null){
byte[] key = getKey(session.getId().toString());
jedisUtil.delete(key);
}
}
public Collection<Session> getActiveSessions() {
System.out.println("get active session");
Set<byte[]> keys = jedisUtil.keys(SHIRO_SESSION_PREFIX);
Set<Session> sessions = new HashSet<Session>();
if(CollectionUtils.isEmpty(keys)){
return sessions;
}
for(byte[] key : keys){
Session session = (Session) SerializationUtils.deserialize(jedisUtil.get(key));
sessions.add(session);
}
return sessions;
}
private void saveSession(Session session){
if(session != null && session.getId() != null){
byte[] key = getKey(session.getId().toString());
byte[] value = SerializationUtils.serialize(session);
jedisUtil.set(key,value);
jedisUtil.expire(key,666);
}
}
private byte[] getKey(String key){
return (SHIRO_SESSION_PREFIX + key).getBytes();
}
}
自己写的sessionManager
public class CustomSessionManager extends DefaultWebSessionManager {
@Override
protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException {
Serializable sessionId = getSessionId(sessionKey);
ServletRequest request = null;
if(sessionKey instanceof WebSessionKey){
request = ((WebSessionKey) sessionKey).getServletRequest();
}
if(request != null && sessionId != null){
Session session = (Session) request.getAttribute(sessionId.toString());
if(session != null){
return session;
}
}
Session session = super.retrieveSession(sessionKey);
if(request != null && sessionId != null){
request.setAttribute(sessionId.toString(),session);
}
return session;
}
}
更多技术文章请关注公众号:架构师Plus,
扫码添加