HttpSessionListener案例: 自定义HttpSession扫描器
如果一个HttpSession对象超过1分钟没有用了,主动干掉
注: 基础原则: 集合在遍历时,是不允许增删其中的元素的,
否则会抛java.util.ConcurrentModificationException异常
-----------------------------------------------------------------------------------------------------------
public class HttpSessionScannerListener implements HttpSessionListener,
ServletContextListener {
// 创建一个集合,存放所有的HttpSession对象
List<HttpSession> sessions = new ArrayList<HttpSession>();
// 创建一把锁,给集合sessions添加session的过程和遍历集合sessions(session过多,
// 遍历的时间长,有新的session加入)的过程加上同一把锁,保证不会被打扰
Object lock = new Object();
// 启动定时器 : 启动应用的时候就开始执行
public void contextInitialized(ServletContextEvent sce) {
Timer t = new Timer();
// 启动扫描任务,启动后立即开始扫描,每个1分钟扫描一次
t.schedule(new SessionScanTask(sessions, lock), 0, 1 * 60 * 1000);
}
// 拿到一个会话对象
public void sessionCreated(HttpSessionEvent se) {
synchronized (lock) {
HttpSession session = se.getSession();
System.out.println(session + "来了");
sessions.add(session);
}
}
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println(session + "去了");
}
public void contextDestroyed(ServletContextEvent sce) { }
}
// 扫描任务的类
class SessionScanTask extends TimerTask {
private List<HttpSession> sessions;
private Object lock;
public SessionScanTask(List<HttpSession> sessions, Object lock) {
this.sessions = sessions;
this.lock = lock;
}
// 扫描HttpSession对象,看看有没有超时的(时限为1分钟)
public void run() {
// 法1:
// 注意不能在集合遍历时增删元素,要改为在ListIterator中增删元素才可以避免
// java.util.ConcurrentModificationException异常
// for(HttpSession session : sessions){
// if((System.currentTimeMillis() - session.getLastAccessedTime()) > 1*60*1000){
// session.invalidate();
// sessions.remove(session);
// }
// }
synchronized (lock) {
ListIterator<HttpSession> it = sessions.listIterator();
while (it.hasNext()) {
HttpSession session = it.next();
if ((System.currentTimeMillis() - session.getLastAccessedTime()) > 1 * 60 * 1000) {
session.invalidate();
it.remove();
}
}
}
}
}
如果一个HttpSession对象超过1分钟没有用了,主动干掉
注: 基础原则: 集合在遍历时,是不允许增删其中的元素的,
否则会抛java.util.ConcurrentModificationException异常
-----------------------------------------------------------------------------------------------------------
public class HttpSessionScannerListener implements HttpSessionListener,
ServletContextListener {
// 创建一个集合,存放所有的HttpSession对象
List<HttpSession> sessions = new ArrayList<HttpSession>();
// 创建一把锁,给集合sessions添加session的过程和遍历集合sessions(session过多,
// 遍历的时间长,有新的session加入)的过程加上同一把锁,保证不会被打扰
Object lock = new Object();
// 启动定时器 : 启动应用的时候就开始执行
public void contextInitialized(ServletContextEvent sce) {
Timer t = new Timer();
// 启动扫描任务,启动后立即开始扫描,每个1分钟扫描一次
t.schedule(new SessionScanTask(sessions, lock), 0, 1 * 60 * 1000);
}
// 拿到一个会话对象
public void sessionCreated(HttpSessionEvent se) {
synchronized (lock) {
HttpSession session = se.getSession();
System.out.println(session + "来了");
sessions.add(session);
}
}
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println(session + "去了");
}
public void contextDestroyed(ServletContextEvent sce) { }
}
// 扫描任务的类
class SessionScanTask extends TimerTask {
private List<HttpSession> sessions;
private Object lock;
public SessionScanTask(List<HttpSession> sessions, Object lock) {
this.sessions = sessions;
this.lock = lock;
}
// 扫描HttpSession对象,看看有没有超时的(时限为1分钟)
public void run() {
// 法1:
// 注意不能在集合遍历时增删元素,要改为在ListIterator中增删元素才可以避免
// java.util.ConcurrentModificationException异常
// for(HttpSession session : sessions){
// if((System.currentTimeMillis() - session.getLastAccessedTime()) > 1*60*1000){
// session.invalidate();
// sessions.remove(session);
// }
// }
synchronized (lock) {
ListIterator<HttpSession> it = sessions.listIterator();
while (it.hasNext()) {
HttpSession session = it.next();
if ((System.currentTimeMillis() - session.getLastAccessedTime()) > 1 * 60 * 1000) {
session.invalidate();
it.remove();
}
}
}
}
}
-----------------------------------------------------------------------------------------------------------