网站使用session保存登录用户信息 不过如果在两个浏览器登陆的话服务器就会出现两条session。
要保证用户不重复登录,那么该用户的session应该保证只有一个.
@Component
public class LoadDataCache implements ApplicationListener {//在线用户(用于控制用户不可重复登录)
private static HashMap<String,HttpSession> ONLINE_OPERS= new HashMap<String,HttpSession>();public static boolean isOnline(String oper_no){
if(ONLINE_OPERS.containsKey(oper_no)){
return true;
}
return false;
}
public static void addOnline(String oper_no,HttpSession session){
ONLINE_OPERS.put(oper_no, session);
}
public static void removeOnline(String oper_no){
ONLINE_OPERS.remove(oper_no);
}
public static HttpSession getOnlineSession(String oper_no){
return ONLINE_OPERS.get(oper_no);
}}
这里我用实现org.springframework.context.ApplicationListener接口的类存储全局变量ONLINE_OPERS记录已登录的用户.
在登录时判断用户的session是否存在,不存在才可登录,并把登录的session添加到ONLINE_OPERS中.
在session销毁时,从ONLINE_OPERS移除.
public class SessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent event) {
// TODO Auto-generated method stub
}@Override
public void sessionDestroyed(HttpSessionEvent event) {
//在session销毁的时候,把LoadDataCache的ONLINE_OPERS中保存的值清除
HttpSession session = event.getSession();
String oper_no = (String)session.getAttribute("OPER_NO");
if(!"admin".equals(oper_no)&&oper_no!=null){
LoadDataCache.removeOnline(oper_no);
}
}}
需要注意直接关闭浏览器,session是不会立即销毁的,需要用js监听关闭事件,通过ajax通知服务器销毁session.
或者也可以通过将之前的session销毁的方式,来防止用户重复登录.(可以理解为异地登陆挤下线)
LoadDataCache.getOnlineSession(oper_no).invalidate();
LoadDataCache.removeOnline(oper_no);LoadDataCache.addOnline(oper_no, getSession());