`

用Collection和HttpSessionListener获取当前所有会话信息

阅读更多

web.xml: //注册

<listener>
<listener-class>org.eleaf.qsls.server.ActiveUserListener</listener-class>
</listener>

ActiveUserListener.java:
package org.eleaf.qsls.server;

import java.util.*;
import javax.servlet.http.*;
import org.eleaf.qsls.bbs.*;


public class ActiveUserListener implements HttpSessionListener {
private static int sessionCount = 0;
private static Map sessionMaps = new HashMap(); //存放session的集合类

public void sessionCreated(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
String sessionId = session.getId();
System.out.println("Create a session:" + sessionId);
sessionMaps.put(sessionId, session);

sessionCount++;
}

public void sessionDestroyed(HttpSessionEvent arg0) {
sessionCount--;
String sessionId = arg0.getSession().getId();
sessionMaps.remove(sessionId);//利用会话ID标示特定会话
System.out.println("Destroy a session:" + sessionId);
}
public static int getSessionCount() {
return sessionCount;
}
public static Map getSessionMaps() {
return sessionMaps;
}
}

chklogin.jsp:

String name = request.getParameter("name");
String password = request.getParameter("password");
if (name == null && password == null) {
response.sendRedirect("default.jsp");
return;
}
Author author = new Author(); //一个拥有一系列field字段和getter,setter方法的类,代表每个会话用户,直接映射到数据表
author.setName(name);
author.setPassword(password);
Community community = new Community(); //代表社区类,封装一些全局操作。

int authorId = community.checkAuthor(author); //在数据库中检索登陆数据,如果匹配则返回用户ID,否则返回0
if (0 != authorId) {
Author sessionAuthor = community.getAuthor(authorId); //重新查询数据库,返回当前用户所有信息。
session.setAttribute("AUTHOR_INFO", sessionAuthor); //将从数据库得到的用户信息存放入会话
%>
<jsp:forward page="main.jsp" />
<%
} else {
out.println("登陆失败,请返回重试!<br><a href='default.jsp'>返回</a>");
}

main.jsp: //显示当前所有会话信息

<%@ page import=“org.eleaf.qsls.bbs.*,org.eleaf.qsls.server.*“>
Map activeSessions = ActiveUserListener.getSessionMaps();
Collection sessionsCollection = activeSessions.values();//得到当前所有会话之集合
Iterator iterSessions = sessionsCollection.iterator();
for (;iterSessions.hasNext();) {
HttpSession mySession = (HttpSession) iterSessions.next();
Author myAuthor = (Author) mySession.getAttribute("AUTHOR_INFO");
if (author == null) {
continue;
}
String myName = myAuthor.getName();
%>
<a href="#"><%=myName%></a> |
<%
}

分析:

关键在于保存在集合中的元素都只是对外部对象的引用。所以当外部对象的数据被人为改变以后,在集合内部也同样进行了自动更新。

分享到:
评论

相关推荐

    HttpSessionListener在线人数和历史访问量

    这个接口是Java Servlet API的一部分,通过实现它,开发者可以获取到Web应用中的在线用户数量以及历史访问量的信息。下面将详细介绍如何使用`HttpSessionListener`来实现这些功能。 首先,我们需要创建一个类并实现...

    HttpSessionListener 和HttpSessionBindingListener的区别 单点登录

    `HttpSessionListener`主要用于监听整个应用程序中的所有会话(`HttpSession`)的创建和销毁事件。这对于维护全局状态非常有用,例如在线用户列表。当一个新会话被创建或一个现有会话被销毁时,`HttpSessionListener...

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

    在Spring boot中通过HttpSessionListener监听器统计在线人数是一种常见的技术实现方式,适用于需要跟踪和管理用户会话状态的Web应用程序。以下是从给定文件中提炼的关键知识点。 首先,了解HttpSessionListener接口...

    分布式会话demo.zip

    2. **会话持久化**:另一种策略是会话持久化,将会话数据存储在持久化介质(如数据库、文件系统)中,当用户请求到达时,服务器从持久化存储中获取会话信息。这种方式可以减少网络传输,但增加了IO操作。 3. **Java...

    在ASP.NET中而不是在Java中使用httpsessionlistener做什么?

    在ASP.NET中,`HttpSessionState`提供了一个丰富的API来操作会话数据,包括设置和获取会话变量、删除会话、检查会话是否有效等。默认情况下,ASP.NET使用基于Cookie的会话ID来跟踪用户的会话,但也可以配置为无...

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

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

    解决因浏览器关闭导致购物车数据丢失问题

    在提供的代码中,`CartSessionListener`类实现了`HttpSessionListener`,并维护了一个`HashMap`来缓存所有的会话。当新的会话创建时,会话的ID和会话对象被添加到缓存中;当会话销毁时,对应的会话ID会被从缓存中...

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

    此外,用户的登录信息(sessionID和IP地址)获取也需要使用Servlet API提供的方法,例如request对象的getSession()方法获取sessionID,request对象的getRemoteAddr()方法获取用户IP地址。这些细节在编写代码时需要...

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

    3. 使用HttpSessionListener监听会话的创建和销毁,当会话销毁时,从Vector中移除相应的会话ID。 4. 想要获取在线人数时,遍历Vector,计算其中的元素数量,即为当前在线用户数。 5. 为了保证数据的实时性,可以在...

    java 在Jetty9中使用HttpSessionListener和Filter

    Java 在 Jetty9 中使用 HttpSessionListener 和 Filter Java 在 Jetty9 中使用 HttpSessionListener 和 Filter 是一种常见的技术,用于监听和过滤 HTTP 请求。在这篇文章中,我们将详细介绍如何在 Jetty9 中使用 ...

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

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

    使用SessionListener+持久化Session+Springmvc拦截器实现单点登录

    4. **单点登录逻辑**:在`preHandle`中,检查当前请求的会话是否有效,无效则引导至登录页面,登录成功后更新全局的会话信息。 5. **会话超时处理**:可以在拦截器中设置会话超时检测,如果会话即将过期,可以提示...

    java统计在线人数

    - 在大型系统中,考虑分布式环境下的会话管理,例如使用分布式缓存(如Redis)来共享会话信息。 - 为了提高统计准确性,应考虑到可能存在的并发问题,确保增加和减少在线人数的计数操作是线程安全的。 以上就是...

    model2+监听+过滤器

    2. **监听器统计**:使用`HttpSessionListener`监听会话的创建和销毁。当新的会话创建时,增加在线用户计数;当会话因为用户登出或超时销毁时,减少计数。 3. **过滤器保护**:定义一个过滤器,对所有需要登录才能...

    servlet监听器实现踢人小案例

    `HttpSessionListener`用于监听会话的创建和销毁事件,而`HttpSessionAttributeListener`则可以监听到会话属性的变化。 在本案例中,我们可能会实现`HttpSessionListener`,以便在会话开始和结束时执行相应的操作。...

    Servlet技术(事件监听器-在线踢人).zip

    在实际开发中,为了实现“在线踢人”,开发者可能还需要考虑到其他方面,比如安全性、并发控制、数据库操作(存储用户信息和在线状态)等。这通常涉及到数据库查询以获取用户的会话ID,然后在服务器端进行操作。同时...

    HttpSessionBindingListener获取在线用户数(转)

    // 获取当前在线用户数,可能需要从某个全局存储(如ServletContext)中获取 private int getOnlineCount() { // 这里只是一个示例,实际应用中可能需要从ServletContext或其他地方获取 return 0; } // 设置...

    jsp中servlet过滤器和侦听器

    - `getServletContext()`: 返回当前Web应用的ServletContext对象,用于获取应用级别的信息。 3. **FilterChain接口** - `doFilter(ServletRequest request, ServletResponse response)`: 执行过滤链中的下一个...

    SessionListener

    在Java Web开发中,`SessionListener`是一种非常重要的机制,它允许我们监听用户会话(Session)的创建和销毁事件。`Session`是服务器用来跟踪用户状态的一种方式,尤其是在无状态的HTTP协议下。当我们需要在用户多...

    Java Web应用开发 53 课堂案例-应用监听器统计在线人数.docx

    需要注意的是,由于监听器是基于会话的,因此如果用户的浏览器禁用了会话或者使用了隐私模式,这种统计方式可能无法准确反映所有在线用户。 总结来说,本案例主要涉及以下几个知识点: 1. `HttpSessionListener`...

Global site tag (gtag.js) - Google Analytics