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> |
<%
}
分析:
关键在于保存在集合中的元素都只是对外部对象的引用。所以当外部对象的数据被人为改变以后,在集合内部也同样进行了自动更新。
分享到:
相关推荐
这个接口是Java Servlet API的一部分,通过实现它,开发者可以获取到Web应用中的在线用户数量以及历史访问量的信息。下面将详细介绍如何使用`HttpSessionListener`来实现这些功能。 首先,我们需要创建一个类并实现...
`HttpSessionListener`主要用于监听整个应用程序中的所有会话(`HttpSession`)的创建和销毁事件。这对于维护全局状态非常有用,例如在线用户列表。当一个新会话被创建或一个现有会话被销毁时,`HttpSessionListener...
在Spring boot中通过HttpSessionListener监听器统计在线人数是一种常见的技术实现方式,适用于需要跟踪和管理用户会话状态的Web应用程序。以下是从给定文件中提炼的关键知识点。 首先,了解HttpSessionListener接口...
2. **会话持久化**:另一种策略是会话持久化,将会话数据存储在持久化介质(如数据库、文件系统)中,当用户请求到达时,服务器从持久化存储中获取会话信息。这种方式可以减少网络传输,但增加了IO操作。 3. **Java...
在ASP.NET中,`HttpSessionState`提供了一个丰富的API来操作会话数据,包括设置和获取会话变量、删除会话、检查会话是否有效等。默认情况下,ASP.NET使用基于Cookie的会话ID来跟踪用户的会话,但也可以配置为无...
用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...
在提供的代码中,`CartSessionListener`类实现了`HttpSessionListener`,并维护了一个`HashMap`来缓存所有的会话。当新的会话创建时,会话的ID和会话对象被添加到缓存中;当会话销毁时,对应的会话ID会被从缓存中...
此外,用户的登录信息(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 是一种常见的技术,用于监听和过滤 HTTP 请求。在这篇文章中,我们将详细介绍如何在 Jetty9 中使用 ...
jsp 统计在线人数实例,是个完整的项目实例,部署即可查看效果! 通过使用:HttpSessionListener、HttpSessionBindingListener来实现. valueBound 方法登录触发。 valueUnbound 方法退出触发。
4. **单点登录逻辑**:在`preHandle`中,检查当前请求的会话是否有效,无效则引导至登录页面,登录成功后更新全局的会话信息。 5. **会话超时处理**:可以在拦截器中设置会话超时检测,如果会话即将过期,可以提示...
- 在大型系统中,考虑分布式环境下的会话管理,例如使用分布式缓存(如Redis)来共享会话信息。 - 为了提高统计准确性,应考虑到可能存在的并发问题,确保增加和减少在线人数的计数操作是线程安全的。 以上就是...
2. **监听器统计**:使用`HttpSessionListener`监听会话的创建和销毁。当新的会话创建时,增加在线用户计数;当会话因为用户登出或超时销毁时,减少计数。 3. **过滤器保护**:定义一个过滤器,对所有需要登录才能...
`HttpSessionListener`用于监听会话的创建和销毁事件,而`HttpSessionAttributeListener`则可以监听到会话属性的变化。 在本案例中,我们可能会实现`HttpSessionListener`,以便在会话开始和结束时执行相应的操作。...
在实际开发中,为了实现“在线踢人”,开发者可能还需要考虑到其他方面,比如安全性、并发控制、数据库操作(存储用户信息和在线状态)等。这通常涉及到数据库查询以获取用户的会话ID,然后在服务器端进行操作。同时...
// 获取当前在线用户数,可能需要从某个全局存储(如ServletContext)中获取 private int getOnlineCount() { // 这里只是一个示例,实际应用中可能需要从ServletContext或其他地方获取 return 0; } // 设置...
- `getServletContext()`: 返回当前Web应用的ServletContext对象,用于获取应用级别的信息。 3. **FilterChain接口** - `doFilter(ServletRequest request, ServletResponse response)`: 执行过滤链中的下一个...
在Java Web开发中,`SessionListener`是一种非常重要的机制,它允许我们监听用户会话(Session)的创建和销毁事件。`Session`是服务器用来跟踪用户状态的一种方式,尤其是在无状态的HTTP协议下。当我们需要在用户多...
需要注意的是,由于监听器是基于会话的,因此如果用户的浏览器禁用了会话或者使用了隐私模式,这种统计方式可能无法准确反映所有在线用户。 总结来说,本案例主要涉及以下几个知识点: 1. `HttpSessionListener`...