一、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技术来构建实际的应用程序,比如人力资源管理系统。这个压缩包包含源码下载和一个使用JSP(JavaServer Pages)和Servlet实现的人力...
总之,"一个支持servlet的web服务器.rar"这个压缩包可能包含了一个可运行的Servlet服务器实例或者一个与Servlet相关的项目。如果你打算学习或使用Servlet,你需要了解Servlet的基本概念、生命周期、API以及如何在...
Servlet是Java Web开发中的核心组件,它是一种服务器端的Java应用程序,主要用于扩展Web服务器的功能,处理来自客户端(通常是Web浏览器)的请求并返回响应。在深入理解Servlet之前,我们需要先了解一些基本概念。 ...
为了运行提供的`Servlet_Test`压缩包中的例子,你需要将项目导入到IDE中,添加Servlet相关的jar包(如servlet-api.jar),然后按照上述步骤配置和运行。 总结,Servlet是Java Web开发的重要组成部分,用于处理HTTP...
1. **Web应用**:一组相关的资源(HTML、CSS、JavaScript、图片、Servlet类等),按照特定的目录结构打包成WAR(Web Archive)文件,部署在容器中。 2. **部署描述符**(web.xml):这是Web应用的配置文件,定义了...
用户将书籍添加到购物车后,相关信息会被存储在Cookie或Session中,当用户进行结算时,这些信息会被Servlet读取并用于生成订单。 此外,为了确保系统的安全性和性能,可能会使用过滤器(Filter)来拦截和处理请求,...
本篇文章将深入讲解Servlet的相关内容,包括其基本概念、生命周期、工作原理以及如何通过实例来理解和应用Servlet。 一、Servlet基本概念 Servlet是Java Servlet API规范定义的一种接口,用于扩展服务器的功能。在...
在ShoppCar这个子文件中,可能包含了购物车相关的Servlet类、JSP页面、数据库操作代码、甚至可能有专门处理购物车操作的过滤器或监听器。通过对这个文件的深入理解和修改,我们可以完善购物系统的购物车功能,比如...
在描述中提到的"全新的servlet相关jar包,值得学习与研究",暗示了这是一个新的版本或者更新,包含了最新的Servlet规范和API。学习和研究Servlet API对于理解Web服务器如何处理HTTP请求,以及如何编写服务端代码来...
在这个压缩包中,我们可能会找到`javax`包,这是Java标准库的一部分,包含了Servlet相关的类和接口。 Servlet API主要包含以下几个核心概念: 1. **Servlet接口**:所有Servlet都必须实现这个接口,它定义了...
在"day02"这个目录中,很可能包含了多个Servlet实例和相关的配置文件。你可以通过以下步骤进行实践: 1. 创建Servlet:创建一个新的Java类,继承`HttpServlet`,重写`doGet()`和`doPost()`方法。 2. 注册Servlet:在...
这篇博客"Servlet进阶的相关内容"可能深入探讨了Servlet的高级特性和实践应用。由于没有直接提供博客的具体内容,我会根据Servlet的常见进阶主题进行详细的阐述。 1. **Servlet生命周期**:Servlet在服务器启动时...
下面将详细介绍Servlet API的相关知识点。 1. **Servlet概念**: Servlet是一个Java类,它扩展了服务器的功能,尤其是用于Web应用。它被部署在Web服务器或应用服务器中,接收并响应来自客户端(如浏览器)的HTTP...
- pageContext:提供对JSP页面中不同范围变量的访问,以及获取servlet相关的对象。 - session:对应HttpSession对象,用于存储用户会话期间的状态信息。 - application:即ServletContext对象,提供关于Servlet...
SCWCD认证是Java Web开发者的权威证明,涵盖Servlet和JSP的相关知识。《Head First Servlet & JSP》作为备考书籍,不仅涵盖了考试大纲中的所有知识点,还通过生动的图表、游戏和互动方式帮助读者理解并记忆复杂概念...
这些库文件是开发和运行Servlet应用程序所必需的,它们提供了Servlet和JSP的相关接口和类。 ### 使用Servlet插件 使用Servlet插件,开发者可以: 1. **部署Web应用**:将打包好的WAR文件放入Servlet容器的相应目录...
当我们说一个Servlet是线程不安全的,意味着在多线程环境下,该Servlet的行为可能会出现问题,如数据混乱、竞态条件或死锁。 首先,让我们深入理解Servlet的工作原理。当一个HTTP请求到达Web服务器,服务器会创建一...
Servlet是Java平台上的一个核心技术,它主要用于扩展Web服务器的功能,提供了一种安全、可移植且易用的方式来处理客户端的请求。Servlet的本质是Java类,它运行在服务器端,不依赖于特定的浏览器,而是通过Servlet...
这个压缩包文件包含了一系列与这三个主题相关的课件和示例代码,旨在帮助学习者深入理解并掌握这些技术。 1. **Java**:Java是一种面向对象的编程语言,广泛应用于服务器端开发。它具有跨平台性、安全性和高性能的...