现在做的一块app 查药专家,需要限制用户唯一登陆,参考了网上的代码,简单实现了一下
实现HttpSessionAttributeListener ,监听addAtrribute事件
package com.kbs.platform.filter;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import com.kbs.platform.base.MySessionContext;
import com.kbs.platform.vo.LoginedUser;
/**
* 监听属性新增事件
* @author kbs
*
*/
public class SoleLoginListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
String name=se.getName();
if (name.equals("userInfo")) {
LoginedUser loginedUser=(LoginedUser) se.getValue();
if (MySessionContext.getUserInfo(loginedUser.getUserId())!=null) {
//String oldSession=
//MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())).removeAttribute("userInfo");
//MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())).removeAttribute("userID");
//MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())).removeAttribute("user");
MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())).invalidate();
MySessionContext.DelSession(MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())));
}
MySessionContext.addUserInfo(loginedUser.getUserId(), loginedUser.getSessionId());
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
String name=se.getName();
if (name.equals("userInfo")) {
LoginedUser loginedUser=(LoginedUser) se.getValue();
MySessionContext.removeUserInfo(loginedUser.getUserId());
}
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
}
}
简单的保存信息的上下文
package com.kbs.platform.base;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
public class MySessionContext {
private static Map mymap = new HashMap<>();
private static Map loginedUser=new HashMap<>();
public static synchronized void AddSession(HttpSession session) {
if (session != null) {
mymap.put(session.getId(), session);
}
}
public static synchronized void DelSession(HttpSession session) {
if (session != null) {
mymap.remove(session.getId());
}
}
public static synchronized HttpSession getSession(String session_id) {
if (session_id == null)
return null;
return (HttpSession) mymap.get(session_id);
}
public static synchronized String getUserInfo(Integer userId){
if (userId==null) {
return null;
}
return loginedUser.get(userId);
};
public static synchronized void addUserInfo(Integer userId,String sessionId){
loginedUser.put(userId, sessionId);
}
public static synchronized void removeUserInfo(Integer userId){
if (userId!=null) {
loginedUser.remove(userId);
}
}
}
web.xml配置
com.kbs.platform.filter.SoleLoginListener
基本可以实现.
包括上一篇的登录状态的保持,其实都可以在redis中实现.思路基本差不多