在web应用中,常常需要禁止用户重复登录。这里,介绍的方法是通过配置session监听+shiro权限控制框架实现。具体的方法是:
用户登录成功后,将用户信息放入HashMap中,如果存在重复,强制注销之前的session,使之过期。
1、session 类
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);
}
}
}
}
2、web.xml配置
<!-- 监听session,实现单点登录 -->
<listener>
<listener-class>zteict.qinhuangdao.framework.base.utils.SessionListener</listener-class>
</listener>
3、用户登录代码
//用户登录成功后,更新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());
}
4、在线用户vo类
/**
* @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;
}