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

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

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

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

/**
* Created by IntelliJ IDEA.
* User: xj
* Date: 2007-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>

 

 

 

 

 

 

继上次说到Listener的功效,这里就不得不说说另外一个接口HttpSessionListener了。

上次说到了ServletContextListener,它是用来监听Servlet Context的创建和销毁的状态。今天特别有兴趣在

聊聊另一个监听的接口,名字叫做HttpSessionListener。

在理解这个接口之前,先提出一个问题,就是假设我的web应用上想知道到底有多少用户在使用?

首先看一段代码。

package demo.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionCounter implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent event) {
        ServletContext ctx = event.getSession( ).getServletContext( );
        Integer numSessions = (Integer) ctx.getAttribute("numSessions");
        if (numSessions == null) {
            numSessions = new Integer(1);
        }
        else {
            int count = numSessions.intValue( );
            numSessions = new Integer(count + 1);
        }
        ctx.setAttribute("numSessions", numSessions);
    }
    public void sessionDestroyed(HttpSessionEvent event) {
        ServletContext ctx = event.getSession( ).getServletContext( );
        Integer numSessions = (Integer) ctx.getAttribute("numSessions");
        if (numSessions == null) {
            numSessions = new Integer(0);
        }
        else {
            int count = numSessions.intValue( );
            numSessions = new Integer(count - 1);
        }
        ctx.setAttribute("numSessions", numSessions);
    }
}

在这个解决方案中,任何一个Session被创建或者销毁时,都会通知SessionCounter 这个类,当然通知的原因是必须在web.xml文件中做相关的配置工作。如下面的配置代码:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
   
<web-app>
<display-name>Struts Examples</display-name>

<listener>
      <listener-class>demo.listener.SessionCounter</listener-class>
</listener>
... rest of web.xml

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值