`

servlet 相关问题 (一)

 
阅读更多

 

一、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>

 
    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    servlet相关的实例(共三个包)第一包

    在这个“servlet相关的实例(共三个包)第一包”中,我们可以深入理解如何使用Servlet技术来构建实际的应用程序,比如人力资源管理系统。这个压缩包包含源码下载和一个使用JSP(JavaServer Pages)和Servlet实现的人力...

    一个支持servlet的web服务器.rar

    总之,"一个支持servlet的web服务器.rar"这个压缩包可能包含了一个可运行的Servlet服务器实例或者一个与Servlet相关的项目。如果你打算学习或使用Servlet,你需要了解Servlet的基本概念、生命周期、API以及如何在...

    servlet的有关知识

    Servlet是Java Web开发中的核心组件,它是一种服务器端的Java应用程序,主要用于扩展Web服务器的功能,处理来自客户端(通常是Web浏览器)的请求并返回响应。在深入理解Servlet之前,我们需要先了解一些基本概念。 ...

    Servlet的一个基础例子

    为了运行提供的`Servlet_Test`压缩包中的例子,你需要将项目导入到IDE中,添加Servlet相关的jar包(如servlet-api.jar),然后按照上述步骤配置和运行。 总结,Servlet是Java Web开发的重要组成部分,用于处理HTTP...

    servlet基础与servlet容器模型

    1. **Web应用**:一组相关的资源(HTML、CSS、JavaScript、图片、Servlet类等),按照特定的目录结构打包成WAR(Web Archive)文件,部署在容器中。 2. **部署描述符**(web.xml):这是Web应用的配置文件,定义了...

    基于servlet的一个网上书城

    用户将书籍添加到购物车后,相关信息会被存储在Cookie或Session中,当用户进行结算时,这些信息会被Servlet读取并用于生成订单。 此外,为了确保系统的安全性和性能,可能会使用过滤器(Filter)来拦截和处理请求,...

    servlet 相关内容

    本篇文章将深入讲解Servlet的相关内容,包括其基本概念、生命周期、工作原理以及如何通过实例来理解和应用Servlet。 一、Servlet基本概念 Servlet是Java Servlet API规范定义的一种接口,用于扩展服务器的功能。在...

    基于Servlet的购物系统

    在ShoppCar这个子文件中,可能包含了购物车相关的Servlet类、JSP页面、数据库操作代码、甚至可能有专门处理购物车操作的过滤器或监听器。通过对这个文件的深入理解和修改,我们可以完善购物系统的购物车功能,比如...

    servlet-api_servlet_

    在描述中提到的"全新的servlet相关jar包,值得学习与研究",暗示了这是一个新的版本或者更新,包含了最新的Servlet规范和API。学习和研究Servlet API对于理解Web服务器如何处理HTTP请求,以及如何编写服务端代码来...

    serlvet 源码 servlet-src 源文件

    在这个压缩包中,我们可能会找到`javax`包,这是Java标准库的一部分,包含了Servlet相关的类和接口。 Servlet API主要包含以下几个核心概念: 1. **Servlet接口**:所有Servlet都必须实现这个接口,它定义了...

    servlet 心的练习

    在"day02"这个目录中,很可能包含了多个Servlet实例和相关的配置文件。你可以通过以下步骤进行实践: 1. 创建Servlet:创建一个新的Java类,继承`HttpServlet`,重写`doGet()`和`doPost()`方法。 2. 注册Servlet:在...

    Servlet进阶的相关内容

    这篇博客"Servlet进阶的相关内容"可能深入探讨了Servlet的高级特性和实践应用。由于没有直接提供博客的具体内容,我会根据Servlet的常见进阶主题进行详细的阐述。 1. **Servlet生命周期**:Servlet在服务器启动时...

    servlet api servlet api

    下面将详细介绍Servlet API的相关知识点。 1. **Servlet概念**: Servlet是一个Java类,它扩展了服务器的功能,尤其是用于Web应用。它被部署在Web服务器或应用服务器中,接收并响应来自客户端(如浏览器)的HTTP...

    JSP和SERVLET笔试常遇到的一些问题

    - pageContext:提供对JSP页面中不同范围变量的访问,以及获取servlet相关的对象。 - session:对应HttpSession对象,用于存储用户会话期间的状态信息。 - application:即ServletContext对象,提供关于Servlet...

    Head First Servlet & JSP

    SCWCD认证是Java Web开发者的权威证明,涵盖Servlet和JSP的相关知识。《Head First Servlet & JSP》作为备考书籍,不仅涵盖了考试大纲中的所有知识点,还通过生动的图表、游戏和互动方式帮助读者理解并记忆复杂概念...

    servlet插件

    这些库文件是开发和运行Servlet应用程序所必需的,它们提供了Servlet和JSP的相关接口和类。 ### 使用Servlet插件 使用Servlet插件,开发者可以: 1. **部署Web应用**:将打包好的WAR文件放入Servlet容器的相应目录...

    servlet 模拟

    当我们说一个Servlet是线程不安全的,意味着在多线程环境下,该Servlet的行为可能会出现问题,如数据混乱、竞态条件或死锁。 首先,让我们深入理解Servlet的工作原理。当一个HTTP请求到达Web服务器,服务器会创建一...

    servlet入门经典笔记

    Servlet是Java平台上的一个核心技术,它主要用于扩展Web服务器的功能,提供了一种安全、可移植且易用的方式来处理客户端的请求。Servlet的本质是Java类,它运行在服务器端,不依赖于特定的浏览器,而是通过Servlet...

    JAVA,JSP,SERVLET课件及一些常见问题解决方法

    这个压缩包文件包含了一系列与这三个主题相关的课件和示例代码,旨在帮助学习者深入理解并掌握这些技术。 1. **Java**:Java是一种面向对象的编程语言,广泛应用于服务器端开发。它具有跨平台性、安全性和高性能的...

Global site tag (gtag.js) - Google Analytics