使用session監聽禁止使用者重複登入
阿新 • • 發佈:2019-01-24
在web應用中,常常需要禁止使用者重複登入。這裡,介紹的方法是通過配置session監聽+shiro許可權控制框架實現。具體的方法是:
使用者登入成功後,將使用者資訊放入HashMap中,如果存在重複,強制登出之前的session,使之過期。
1、session 類
2、web.xml配置package zteict.qinhuangdao.framework.base.utils; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import java.util.HashMap; /** * @author: football98 * @createTime:: 16-6-24 * @classDescription: 使用者單點登入session監聽 */ public class SessionListener implements HttpSessionListener { public static HashMap<String,String> userMap = new HashMap<String,String>(); public static HashMap<String,HttpSession> sessionMap = new HashMap<String,HttpSession>(); @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { HttpSession session = httpSessionEvent.getSession(); String sessionId = session.getId(); sessionMap.remove(sessionId); for(String key : userMap.keySet()){ if(userMap.get(key).equals(sessionId)){ userMap.remove(key); } } } }
<!-- 監聽session,實現單點登入 -->
<listener>
<listener-class>zteict.qinhuangdao.framework.base.utils.SessionListener</listener-class>
</listener>
3、使用者登入程式碼
4、線上使用者vo類//使用者登入成功後,更新session Map,如重複登入,強制之前session過期 String sessionid = SessionListener.userMap.get(username); if(sessionid != null&&!sessionid.equals("")){ //登出線上使用者,如果session id 相同,不銷燬。 if(!sessionid.equals(request.getSession().getId())){ SessionListener.sessionMap.get(sessionid).invalidate(); SessionListener.userMap.put(username,request.getSession().getId()); SessionListener.sessionMap.put(request.getSession().getId(),request.getSession()); } }else{ if(SessionListener.sessionMap.containsKey(request.getSession().getId())){ SessionListener.sessionMap.remove(request.getSession().getId()); for(String key : SessionListener.userMap.keySet()){ if(SessionListener.userMap.get(key).equals(request.getSession().getId())){ SessionListener.userMap.remove(key); } } } SessionListener.userMap.put(username,request.getSession().getId()); SessionListener.sessionMap.put(request.getSession().getId(),request.getSession()); }
/** * @author: football98 * @createTime: 16-6-27 * @classDescription:線上使用者vo */ public class OnlineVo { String loginname; public String getLoginname() { return loginname; } public void setLoginname(String loginname) { this.loginname = loginname; } }
5、線上使用者查詢方法l
/**
* 查詢線上使用者資訊
* @return 線上使用者資訊
*/
public List<OnlineVo> queryList(){
HashMap<String,HttpSession> sessionMap = SessionListener.sessionMap;
List<OnlineVo> list = new ArrayList<OnlineVo>();
for(String key : SessionListener.userMap.keySet()){
OnlineVo v = new OnlineVo();
v.setLoginname(key);
list.add(v);
}
return list;
}