1.项目中需要用到单点登陆即只能单个设备或者单个浏览器登陆
本来的方案,是将session取到后,放入redis;但是发现redis在序列化session对象的出现了问题,
原来是因为session对象中有属性的值为null。
后来试着用request获取:
HttpSessionContext SessCon= request.getSession(false).getSessionContext();
HttpSession Sess = SessCon.getSession(SessionId);
通过id去获取session,在同一个浏览器(同一个回话)可行。但,如果是两个不同的浏览器AB则A浏览器的request不能获取到B浏览器的session。
原因:
后来找到了解决方案用HttpSessionListener
@WebListener
public class SessionListener implements HttpSessionListener {
private static SessionListener sessionListener;
public static SessionListener init(){
if(sessionListener == null)
sessionListener = new SessionListener();
return sessionListener;
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
RedisStartCleanCache.sessionCache.put(session.getId().toString(), session);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
public HttpSession getSessionCache(String sessionId) {
return (HttpSession) RedisStartCleanCache.sessionCache.get(sessionId);
}
}
使用HttpSessionListener 来对session的创建和销毁进行监听。
从而达到操作session的目的。