`
收藏列表
标题 标签 来源
处理同步登录问题 mvc
1楼的方法是对的但实现起来会有很多问题,踢掉前一次登录反而最简单,如下代码:
1、添加两个监听器类:
public class MySessionAttributeListener implements HttpSessionAttributeListener {
 public static Map<String, HttpSession> sessionMap=new ConcurrentHashMap<String, HttpSession>();
 
 @Override
 public void attributeAdded(HttpSessionBindingEvent arg0) {
  String name=(String)arg0.getValue();
  if("name".equals(name)){//name属性保存用户登录信息,name=为唯一信息如用户名
   if(sessionMap.containsKey(name)){//踢掉前一次登录
    HttpSession session=sessionMap.remove(name);
    session.invalidate();
   }
   sessionMap.put(name, arg0.getSession());
  }
 }
 @Override
 public void attributeRemoved(HttpSessionBindingEvent arg0) {}
 @Override
 public void attributeReplaced(HttpSessionBindingEvent arg0) {}
}
public class MySessionListener implements HttpSessionListener {
  @Override
  public void sessionCreated(HttpSessionEvent arg0) {}
  @Override
  public void sessionDestroyed(HttpSessionEvent arg0) {
   String name=(String)arg0.getSession().getAttribute("name");
   if(name!=null && name.length()>0){//session失效时候移除记录
    if(MySessionAttributeListener.sessionMap.containsKey(name))
     MySessionAttributeListener.sessionMap.remove(name);
   }
   //else System.out.println("注销用户:未获取到登录用户属性");
  }
}
2、web.xml加入监听
 <listener>
  <listener-class>你的包名.MySessionListener</listener-class>
 </listener>
 <listener>
  <listener-class>你的包名.MySessionAttributeListener</listener-class>
 </listener>
 
3、jsp或servlet中保存登录信息如:
request.getSession().setAttribute("name", "登录信息");









对于用户登录不能同时登录的做法,我的想法是: 
一、策略 
a、后面的登录踢掉前面的登录 
b、给前面的登录提示或者将前面的登录重定向到登出页面 
二、做法 
a、在ServletContext中增加一个HashMap对象,记录登录的用户名及其对应的session对象,其中key为用户名,value为session对象,这样可以利用HashMap的特性快速找到key,尤其是用户量很大的情况下。 
b、当一个用户输入正确的用户名和密码后,到a中生成的HashMap中查找该用户名,如果没有,则说明这个用户名还没有登录,将用户名及对应的session添加到HashMap对象中;如果有,则到c。 
c、取得HashMap中key中对应的session对象,如果session对象不为空,则使用invalidate()方法清理该session对象,同时将key的value置为现在session对象。 
d、增加一个session监听器,监听session摧毁时要执行方法,取得当前session对应的用户名在HashMap中session,比较两个session是否相同,如果是,则清除HashMap中的key。(如果不需要统计在线人数,d步可以没有)。
Global site tag (gtag.js) - Google Analytics