监听器HttpSessionListener

本文介绍如何通过实现HttpSessionListener接口,监听session的创建和销毁,以统计在线人数和管理用户会话。通过在web.xml中配置监听器,可以自动触发sessionCreated和sessionDestroyed方法,实现在用户登录和退出时的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现一个监听器,这个监听器的作用是监听session的创建和销毁。

写一个类,实现HttpSessionListener,实现sessionCreated()  sessionDestroyed()方法。然后在web.xml里面配置这个类的包全名

<listener>
        <listener-class>包全名</listener-class>
</listener>

这个类写好之后,每当用户登录的时候,就会创建session,然后触发这个监听器。执行sessionCreated方法,监听session。

当用户退出的时候销毁session,又会sessionDestroyed方法。

这有什么用呢?

统计在线人数,当前有多少会话。

session在什么时候产生的呢?怎么产生的呢?

用浏览器打开页面就会产生session,不是非要调用方法。因为session在jsp页面源码里面就已经获取了,只要请求到页面就会有session产生。

或者调用servlet的时候使用这个方法  HttpSession session = request.getSession();

我们项目对这个监听器的使用情况简介:

<listener>
   <listener-class>app.util.LoginSessionListener</listener-class>
</listener>

 

public class LoginSessionListener extends BaseFormBean implements HttpSessionListener {
	private static final long serialVersionUID = -5917966270069281361L;
	//保存 userName和session 的映射(userName,session)
	public static Map<String,HttpSession> hUserName = new ConcurrentHashMap<String, HttpSession>();
	
	
	public void sessionCreated(HttpSessionEvent se) {

	}
	
	public void sessionDestroyed(HttpSessionEvent se) {
		Iterator<Map.Entry<String,HttpSession>> iter = hUserName.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry<String,HttpSession> entry = iter.next();
			String key = entry.getKey();
			HttpSession val = entry.getValue();
			if ((val.getId()).equals(se.getSession().getId())) {
				hUserName.remove(key);
				break;
			}
		}
		se.getSession().invalidate();
	}
	
	public static void putSessionMap(HttpSession session, String nUserName){
		hUserName.put(nUserName, session);
		createSysLogBo();
		SysUserToken sysUserToken = new SysUserToken(nUserName,ESBContextListener.jvmNo);
		sysLogBO.insertOrUpdateUserToken(sysUserToken);
	}
	
	/**
	 * 功能描述: 清空指定用户的登录状态
	 * @param sUserName 登录的用户名称
	 */
	public static void doRemove(String sUserName) {
		if (hUserName.containsKey(sUserName)) {
			HttpSession ses = hUserName.get(sUserName);
			hUserName.remove(sUserName);
			ses.invalidate();
		}
	}
	
	
	public static boolean isOnline(String sUserName) {
		return hUserName.containsKey(sUserName);
	}
	
	public static boolean isAddSessionToMap(HttpSession session,
			String sUserName) {
		boolean flag = false;
		if (hUserName.containsKey(sUserName)) {
			flag = true;
		} else {
			flag = false;
			hUserName.put(sUserName, session);
		}
		return flag;
	}
	
}

 

这个监听器的createSession方法没有用到,我们不监听session创建。我们这里面定义了  sessionDestroyed方法,这个方法将登陆时候存储的session取出来用sessionId和传入的session,也就是当前要退出的session对比,相等,将此session从map中移除出去。

初次之外定义了一些其他方法,比如putSessionMap,将登陆时候获得的session信息存储到map中,拿来使用。

isOnline,使用map中的session信息,和传入的比较,判断是否处于活跃状态。

 

总结:建立监听器后,用户退出的时候,调用userLogout销毁session。启动监听器sessionDestroyed,把session信息从map里面移除。用户登录的时候把用户名密码等在session里面存储,并把session存储到map中。中间,使用map集合来使用session信息,判断用户时候活跃,判断用户是否在线。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值