jsp解决session过期时写入数据库操作

背景如下:

我在做一个系统的时候希望实现当用户点击jsp页面上的注销按钮时实现在数据库中保存用户注销的时间. 另外如果用户没有正常退出, 则在session超时时自动记录超时时候的时间.

仿照找到的关于利用HttpSessionListener实现在线人数统计的方法来处理:

对每一个正在访问的用户, J2EE应用服务器会为其建立一个对应的HttpSession对象. 当一个浏览器第一次访问网站的时候, J2EE应用服务器会新建一个HttpSession对象, 并触发HttpSession创建事件, 如果注册了HttpSessionListener事件监听器, 则会调用HttpSessionListener事件监听器的sessionCreated方法.

相反,当这个浏览器访问结束超时的时候, J2EE应用服务器会销 毁相应的HttpSession对象, 触发HttpSession销毁事件, 同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法.

可见, 对应于一个用户访问的开始和结束, 相应的有sessionCreated方法和sessionDestroyed方法执行. 因此, 我们只需在HttpSessionListener实现类的sessionDestroyed方法中让其执行数据库的更新操作就可以了. 下面是示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.shanhh.session;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import libms.service.UserServiceImpl;

public class UserOnlineListener implements HttpSessionListener {

private static long userId = 0;

public static void setUserId(long id) {
userId = id;
}

public void sessionCreated(HttpSessionEvent event) {
}

public void sessionDestroyed(HttpSessionEvent event) {
if (userId > 0) {
// TODO 这里写更新数据库的操作
}
}
}

在web.xml文件中注册一个监听器:

1
2
3
<listener>
<listener-class>com.online.OnlineCountListener</listener-class>
</listener>

在用户登录的时候, 把用户的id使用UserOnlineListener.setUserId(id)的方法保存下来. 当用户点击注销按钮的时候, 调用session.invalidate()的方法清空session, 就会触发监听器sessionDestroyed(HttpSessionEvent event)方法了, 同样, 如果用户非正常退出, 则在session超时的时候, 也会出发该方法.