监听已登录用户信息,需要知道哪些用户已经登录
/**
*
*/
package com.ccc.Listener;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import com.ccc.util.MessageBean;
/**
* @author Administrator
*
*/
public class MessageSessionAttributeListener implements
HttpSessionAttributeListener {
private static List<String> list = new ArrayList<String>();// 存放用户
private static List<MessageBean> msglist = new ArrayList<MessageBean>();// 存放信息
public List<MessageBean> getMsglist() {
return msglist;
}
public void attributeAdded(HttpSessionBindingEvent bindingevent) {
System.out.println("bindingevent.getName()"+bindingevent.getName());
if ("msgUser".equals(bindingevent.getName())) {
list.add((String) bindingevent.getValue());
}
if ("messages".equals(bindingevent.getName())) {
msglist.add((MessageBean) bindingevent.getValue());
}
}
public void attributeRemoved(HttpSessionBindingEvent bindingevent) {
if ("msgUser".equals(bindingevent.getName())) {
list.remove(bindingevent.getValue());
}
}
public void attributeReplaced(HttpSessionBindingEvent bindingevent) {
if ("messages".equals(bindingevent.getName())) {
msglist.add((MessageBean) bindingevent.getSession().getAttribute(
"messages"));
}
}
public List<String> getUserList() {
return this.list;
}
}
HttpSessionBindingListener和HttpSessionAttributeListener是两个经常让初学者弄混的监听器,其实它们有很大的区别。这2个监听器在文章中简称为BindingListener和AttributeListener.
1.BindingListener有2个方法,valueBound(HttpSessinBindingEvent)和valueUnbount(HttpSessionBindingEvent)。实现BindingListener接口的对象被绑 定到session时触发valueBound事件,解除绑定时触发valueUnbound事件。举例来说:
BindingListener
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class UserObject implements HttpSessionBindingListener
{
public void valueBound(HttpSessionBindingEvent event)
{
System.out.println("触发绑定事件!");
}
public void valueUnbound(HttpSessionBindingEvent event)
{
System.out.println("解除和session的绑定");
}
}
UserObject user = new UserObject();
当把该监听器保存到session中,session.setAttribute("user",user)时就会触发valueBound事件.
当该监听器从session中移除时即session.removeAttribute("user"),触发valueUnbound事件;session失效或超时
时也会触发valueUnbound事件。
注意:只有当该监听器(UserObject)保存到session中或从session移除时才会触发事件,其他没有实现该listener对象保存到session时不会触发该事件。
2.AttributeListener接口有3个方法,attributeAdded(HttpSessionBindingEvent),attributeRemoved(HttpSessionBindingEvent),
attributeReplaced(HttpSeesionEvent)。当在session中添加、移除或更改属性值时会触发相应的事件。
例子:
AttributeListener
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->MyListener implements HttpSessionAttributeListener
{
attributeAdded(HttpSessionBindingEvenet event)
{
System.out.println("有对象加入session中");
}
attributeRemoved(HttpSessionBindingEvent event)
{
System.out.println("有对象从session中移除");
}
attributeReplaced(HttpSessionBindingEvent event)
{
System.out.println("属性值改变");
}
}
OtherObject other = new OtherObject();
当有对象添加到session中时,session.setAttribute("object",other)触发attributeAdded事件,
当该对象从session移除时,session.removeAttribute("object")触发attriubteRemoved事件,
当该属性的值发生变化时, session.replaceAttribute("object",another)触发attributeRepalced事件。
注意:只要有对象保存到session中或从session中移除或改变属性的值都会触发相应事件,不论该对象是否实现了AttributeListener。
总结:1.只有实现了HttpSessionBindingListener的类,在和session绑定、解除绑定时触发其事件。
2.实现了HttpSessionAttributeListener后,任何对象(不论其是否实现了AttributeListener)在变化时均触发对应的事件。
import javax.servlet.http.Httpsession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class SessionAttribListen implements HttpSessionAttributeListener {
/** Creates new SessionAttribListen */
public SessionAttribListen() {
System.out.PRintln(getClass().getName());
}
public void attributeAdded(HttpSessionBindingEvent se) {
HttpSession session = se.getSession();
String id = session.getId();
String name = se.getName();
String value = (String) se.getValue();
String source = se.getSource().getClass().getName();
String message = new StringBuffer("Attribute bound to session in ")
.append(source).append("\nThe attribute name: ").append(name)
.append("\n").append("The attribute value:").append(value)
.append("\n").append("The session ID: ").append(id).toString();
System.out.println(message);
}
public void attributeRemoved(HttpSessionBindingEvent se) {
HttpSession session = se.getSession();
String id = session.getId();
String name = se.getName();
if (name == null)
name = "Unknown";
String value = (String) se.getValue();
String source = se.getSource().getClass().getName();
String message = new StringBuffer("Attribute unbound from session in ")
.append(source).append("\nThe attribute name: ").append(name)
.append("\n").append("The attribute value: ").append(value)
.append("\n").append("The session ID: ").append(id).toString();
System.out.println(message);
}
public void attributeReplaced(HttpSessionBindingEvent se) {
String source = se.getSource().getClass().getName();
String message = new StringBuffer("Attribute replaced in session ")
.append(source).toString();
System.out.println(message);
}
}
分享到:
相关推荐
在本主题中,我们将深入探讨如何利用`HttpSessionAttributeListener`来实现显示登录用户列表以及踢人功能。 `HttpSessionAttributeListener`是Servlet规范定义的一种监听器接口,它允许我们监听HTTP会话中的属性...
通常这涉及到查询数据库或缓存中存储的在线用户信息,判断当前登录的用户是否已经存在于在线用户列表中。如果存在,则可以将当前Session的属性清空,或者在数据库中记录并通知用户已登出。 此外,你还可以使用`...
这个接口提供了对用户会话状态变化的观察能力,从而可以实现一些高级功能,如在线人员查看、会话超时提醒、会话数据管理等。本文将深入探讨`HttpSessionBindingListener`的原理及其在实现在线人员统计中的应用。 `...
public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener { @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("Session已过期"); // ...
- 在用户登录时,调用`isRepeatLogin`方法检查用户是否已经在其他地方登录。 - 如果已经登录,则拒绝此次登录请求。 - 如果未登录,则允许登录,并更新全局`Map`。 #### 四、总结 通过上述方法,我们能够有效地控制...
- **登录判断是否已经在线**:`LimiteLogin`服务类负责处理登录限制。这个类通常会包含一个全局的`Map`来存储在线用户,当用户尝试登录时,检查这个`Map`,如果用户已经在列表中,则移除旧的会话。 ```java // ...
* 采用Ajax判断用户代码是否重复 v1.2 * 分页查询用户 v1.3 * 用户维护页面控制 v1.4 * 修改用户 v1.5 * 删除用户 v1.6 * 采用Filter统一设置处理字符集 v1.7 * 用户登录 v1.8 sql注入...
同时,我们调用了`destroyedOldSession()`方法,这一步是为了处理已经登录的同一用户再次登录的情况。我们假设`destroyedOldSession()`会查找并销毁之前登录的相同用户session,从而实现踢出前一个用户的功能。 `...
监听器是实现了特定接口的Java类,这些接口如HttpSessionListener、HttpSessionAttributeListener等,它们是Servlet API的一部分。通过注册监听器,我们可以在session创建、销毁、属性添加、修改或移除等事件发生时...
在JSP中,基于Session的在线用户统计分析是一种常见的用户管理技术,用于追踪并记录当前正在网站上活动的用户。Session是Web应用中用来跟踪用户状态的一种机制,它允许服务器端存储特定用户会话的数据,即使用户在...
2. 在`valueBound`方法中,我们检查当前Session是否已经存在同名的用户对象。如果存在,这意味着用户可能在另一个客户端登录,因此我们需要清除先前的Session,并提示用户已在其他地方登录。 3. 在`valueUnbound`...
在实际开发中,还可以结合`HttpSessionAttributeListener`来监听特定Session属性的变化,例如用户信息、购物车数据等,这在实现用户行为跟踪、购物车更新等功能时非常有用。 总的来说,Java Session监听器是Web应用...
- 当用户首次访问某个网站时,服务器会为该用户创建一个`HttpSession`实例,并且在整个会话过程中保持这个实例的存在。 - 会话的持续时间可以通过设置会话过期时间或用户关闭浏览器来终止。 3. **...
统计在线人数的关键在于识别哪些session对应的是活跃用户。通常,我们可以定义一个全局变量(如`onlineCount`)来记录在线人数,并在用户登录时增加这个计数,在用户注销或session超时时减少计数。 以下是一个简单...
- 创建名为`OnLineDemo`的类,实现`ServletContextListener`, `HttpSessionListener`和`HttpSessionAttributeListener`接口。 - 实现相关方法,如`contextInitialized()`, `contextDestroyed()`, `sessionCreated...
`在线用户列表监听`可能涉及到对`HttpSessionAttributeListener`的使用。这个监听器可以监听到会话中属性的变化,比如添加、移除或更新。每当有用户信息(如用户名)被添加到会话时,我们可以将其添加到在线用户列表...
可以通过实现 `HttpSessionAttributeListener` 接口来监听 session 属性的变化,从而获取用户的 ID。以下是一个简单的示例: ```java import javax.servlet.*; import javax.servlet.http.*; public class ...
- **记录session信息**:当用户成功登录并保存session信息时,将session与用户信息封装为一个对象(如`SessionAndUser`),并将其添加到全局的session列表中。在此过程中,需要先遍历列表检查当前用户是否已存在于...