`

HttpSessionListener进行同名用户剔除登录的方法

    博客分类:
  • J2EE
阅读更多
实现原理,利用HttpSessionListener的监视监听功能。用户登录成功后,在HashMap中放置一组sessionId和userName的组队,对HashMap中的键值信息登录实时进行维护,利用HashMap来判断用户是否已经登录,当前是否在线,然后根据需要是否进行session(假session,指的是hashmap中保存的键值信息)剔除。

1、以下是用于用户登录监听的SessionListener java文件源码:

/**
* Created by ICTREP IDEA.
* User: lnw
* Date: 2011-3-21
* Time: 17:28:33
* To change this template use File | Settings | File Templates.
*/
public class SessionListener implements HttpSessionListener {
          private static final Logger m_logger = Logger.getLogger(LogonAction.class);//用于log4j调试
          private static HashMap hashUserName = new HashMap();//保存sessionID和username的映射
          /**以下是实现HttpSessionListener中的方法**/
          public void sessionCreated(HttpSessionEvent sessionEvent){
          }

          public void sessionDestroyed(HttpSessionEvent sessionEvent){
              hashUserName.remove(sessionEvent.getSession().getId());
          }

          /**
           * isLogining-用于判断用户是否已经登录
           * @param        sessionUserName String-登录的用户名
           * @return boolean-该用户是否已经登录的标志
           * */
          public static boolean isLogining(String sessionUserName) throws Exception{
              return hashUserName.containsValue(sessionUserName);
          }

          /*
           * isOnline-用于判断用户是否在线
           * @param session HttpSession-登录的用户名称
           * @return boolean-该用户是否在线的标志
           */
          public static boolean isOnline(HttpSession session) throws Exception{
              return hashUserName.containsKey(session.getId());
          }

          /*
          * createUserSession-用于建立用户session
          * @param sessionUserName String-登录的用户名称
          */
          public static void createUserSession(HttpSession session,String sessionUserName) throws Exception {
              hashUserName.put(session.getId(),sessionUserName);

              if(m_logger.isDebugEnabled()){//log4j调试信息
                  Iterator debugIter = hashUserName.entrySet().iterator();
                  while (debugIter.hasNext()){
                      Map.Entry entry = (Map.Entry)debugIter.next();
                      Object key = entry.getKey();
                      Object val = entry.getValue();
                      m_logger.debug(sessionUserName);
                      m_logger.debug(key.toString());
                      m_logger.debug(val.toString());
                  }
              }//log4j调试信息结束

          }

          /*
          * createUserSession-根据用户名剔除session
          * @param sessionUserName String-登录的用户名称
          */
          public static void removeUserSession(String sessionUserName) throws Exception{
              Iterator iter = hashUserName.entrySet().iterator();
                  while (iter.hasNext()){
                      Map.Entry entry = (Map.Entry)iter.next();
                      Object key = entry.getKey();
                      Object val = entry.getValue();
                      if(((String)val).equals(sessionUserName)){
                        hashUserName.put(key,null);
                          iter.remove();
                        //hashUserName.remove(key);//当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException 异常也将被抛出。
                      }
                  }
          }

          /*
          * replaceUserSession-用户已经登录则进行session剔除,否则建立新的session
          * @param sUserName String-登录的用户名称
          */
          public static void replaceUserSession(HttpSession session,String sessionUserName) throws Exception {
              if(hashUserName.containsValue(sessionUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hashUserName中)
                  //遍历原来的hashUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
                  Iterator iter = hashUserName.entrySet().iterator();
                  while (iter.hasNext()){
                      Map.Entry entry = (Map.Entry)iter.next();
                      Object key = entry.getKey();
                      Object val = entry.getValue();
                      if(((String)val).equals(sessionUserName)){
                        hashUserName.put(key,null);
                          iter.remove();
                        //hashUserName.remove(key);//当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException 异常也将被抛出。
                    }
                  }
                  hashUserName.put(session.getId(),sessionUserName);//添加现在的sessionID和username
              }else{//如果该用户没登录过,直接添加现在的sessionID和username
                  hashUserName.put(session.getId(),sessionUserName);
              }

              if(m_logger.isDebugEnabled()){//log4j调试信息
                  Iterator debugIter = hashUserName.entrySet().iterator();
                  while (debugIter.hasNext()){
                      Map.Entry entry = (Map.Entry)debugIter.next();
                      Object key = entry.getKey();
                      Object val = entry.getValue();
                      m_logger.debug(sessionUserName);
                      m_logger.debug(key.toString());
                      m_logger.debug(val.toString());
                  }
              }//log4j调试信息结束

          }
}



------------------------------------------------------------------


2、以下是jsp页面用于判断用户是否已登录(session失效)的部分代码:

<html:html>
<head>
<title>here is title</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="css/maincss.css" rel="stylesheet" type="text/css">
</head>
<body>
<% 
         //UserInfoForm为后台定义的获取用户登录信息及保存用户相关信息的一个java bean,userSession为用户登录Action时根据需要组装的放置用户信息的一个bean对象-UserInfoForm,登录成功后被放到session里(这里的session指HttpSession,即服务端根据每个客户端链接产生的带有唯一sessionId)。
         UserInfoForm userInfoForm = (UserInfoForm)request.getSession().getAttribute("userSession");
         //System.out.println("userName="+userInfoForm.getUserName());
         if(userInfoForm.getUserName()==null||userInfoForm.getUserName().equals("")){//从session获取用户信息失败,用户没有登录或session已经超时,返回到登录页面
             RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
          dispatcher.forward(request,response);
         }else{
             if(!SessionListener.isLogining(userInfoForm.getUserName())){//用户没有登录或session已经超时
                 RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
        dispatcher.forward(request,response);
             }else{
                 if(!SessionListener.isOnline(request.getSession())){//当前用户不在线,即session已经被剔除
                     RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
                     dispatcher.forward(request,response);
                 }
             }
         }
%>
</body>
</html:html>





3. 注意:最后别忘了在web.xml文件中配置监听器SessionListener:

    
 <listener>
          <listener-class>com.projectsSrcPath.SessionListener</listener-class>
      </listener>

分享到:
评论
1 楼 jijiqw 2015-12-21  
貌似有多线程同步问题

相关推荐

    HttpSessionListener监听session的创建及销毁,实现在线用户统计

    用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...

    HttpSessionListener 和HttpSessionBindingListener的区别 单点登录

    - 使用`HttpSessionListener`可以监控用户登录状态的变化,及时更新在线用户列表,从而确保各个子系统之间共享正确的用户状态信息。 - 通过`HttpSessionBindingListener`可以在用户登录时绑定必要的认证信息至会话中...

    HttpSessionListener在线人数和历史访问量

    总结,`HttpSessionListener`可以有效地帮助我们跟踪Web应用的在线用户数,而历史访问量的统计则需要结合其他手段,如`Filter`或`Servlet`,以及适当的日志存储和分析机制。在实际项目中,你还需要考虑性能优化、...

    Spring boot通过HttpSessionListener监听器统计在线人数的实现代码

    从以上知识点可以看出,尽管使用HttpSessionListener进行在线人数统计是一个简单易行的方法,但在实际应用中需要考虑各种可能影响统计准确性的因素,并采取相应的措施进行优化。在实际开发中,应根据应用的具体需求...

    用户重复登录问题

    - 在用户登录时,调用`isRepeatLogin`方法检查用户是否已经在其他地方登录。 - 如果已经登录,则拒绝此次登录请求。 - 如果未登录,则允许登录,并更新全局`Map`。 #### 四、总结 通过上述方法,我们能够有效地控制...

    单一登录踢人效果

    在方法中,我们首先判断用户是否已经登录,如果已经登录,则踢出之前的登录状态,否则将当前登录用户添加到sessionMap中。 三、踢人效果实现 在踢人效果实现中,我们需要使用forceLogoutUser方法,该方法用于强行...

    jsp 统计在线人数利用HttpSessionListener、HttpSessionBindingListener

    jsp 统计在线人数实例,是个完整的项目实例,部署即可查看效果! 通过使用:HttpSessionListener、HttpSessionBindingListener来实现. valueBound 方法登录触发。 valueUnbound 方法退出触发。

    S2SH用户重复登录问题[文].pdf

    `sessionCreated()`方法在新的session被创建时调用,但在这个案例中,我们没有在这个方法中添加任何逻辑,因为我们的主要关注点是在用户登录时更新用户状态。 `sessionDestroyed()`方法在session过期或被显式销毁时...

    利用session监听器实现一个客户不能再两个客户端登录。

    当用户登录成功后,服务器会生成一个唯一的Session ID,并将其发送给客户端(通常是通过Cookie)。客户端在后续的请求中携带这个Session ID,服务器根据ID找到对应的Session,从而识别用户。 要实现用户不能在多个...

    Listener单点登录与显示在线用户

    每当用户登录或登出时,Listener会更新这个列表,确保列表中只包含当前活跃的用户。同时,为了提供实时性,可能还需要实现心跳机制,定期检查用户会话的有效性,避免因网络问题导致的假在线情况。 在实际开发中,...

    判断用户是否在线和实时统计在线人数

    2. 当新用户登录或已登录用户发送请求时,将他们的会话ID添加到Vector中。 3. 使用HttpSessionListener监听会话的创建和销毁,当会话销毁时,从Vector中移除相应的会话ID。 4. 想要获取在线人数时,遍历Vector,计算...

    J2EE 用监听器实现同一用户只能有一个在线.docx

    3. 在`sessionDestroyed()`方法中,清除对应的用户登录信息,表示该用户已下线。 在实际应用中,我们还需要考虑如何存储和查找用户的登录信息。这里可以使用`ServletContext`对象,它在整个Web应用程序中是唯一的,...

    Java 多用户登录限制的实现方法

    在Java Web开发中,多用户登录限制是一个常见的需求,它涉及到用户安全性、用户体验以及系统资源的有效利用。本文将深入探讨如何在Java环境中实现这一功能,包括两种主要的实现策略,并提供具体的代码示例。 首先,...

    SSH框架登录示例 同一账户只能一人登录

    用户注销 非正常退出 session失效 三种情况来进行 控制 分别使用了两种方式 进行了实现1:不修改数据库使用HashMap+HttpSessionListener 2:给数据库添加online列 使用(数据库脚本包含在内)HashMap+...

    单点登录,同时登录人数可以自行设置

    例如,我们可以创建一个`HttpSessionListener`,在用户登录时增加在线用户计数,登出时减少计数,以此来监控并控制同时登录的人数。 web.xml相关设置.txt文件可能包含了配置监听器的代码片段。在Servlet容器(如...

    seeeion 监听用户,控制同一个用户不能同时登陆

    由于HTTP协议本身是无状态的,为了跟踪用户的状态,服务器会在用户登录后创建一个Session对象,并将其关联到特定的用户。这个Session对象通常包含用户信息,如用户名、权限等。当用户在其他地方再次尝试登录时,...

    Java Web之限制用户多处登录实例代码

    Java Web之限制用户多处登录实例代码 本篇文章主要介绍了Java Web之限制用户多处登录实例代码,可以限制单个用户在多个终端登录。该实现方法通过使用一个全局Map在登录的时候用来保存sessionId,Map的key为登录名,...

    Javaweb监听器实例之统计在线人数

    HttpSessionListener用于跟踪用户登录和登出,以此统计在线人数;ServletRequestListener则用于每个用户请求创建时的处理。 在实现统计在线人数的功能时,需要实现以下功能: 1. 当用户登录时(即会话创建时),...

    session保证两用户不能同时登陆一个账号

    - **`sessionCreated`**:当新用户登录时,为该用户创建一个新的`User`对象,并将其`session` ID设置进去。同时将这个`User`对象存入`session`中。 - **`sessionDestroyed`**:当`session`销毁时(例如,用户关闭...

    jsp中监听器实现在线用户统计

    当用户登录时,一个新的HttpSession会话会被创建,我们可以在此时将用户的用户名作为会话属性存储。同样,当用户退出或会话超时时,会话销毁,我们可以从会话属性中移除用户信息,并更新在线用户计数。 2. **...

Global site tag (gtag.js) - Google Analytics