import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.jms.Session;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.transaction.Synchronization;
/*
* 需求是每隔多少秒去扫描session,自定义一个session让她能够真正的自动移除过期session
*/
public class SessionScanner implements ServletContextListener,
HttpSessionListener {
//定义一个集合来装下session,为了解决线程安全问题,采用Collections.synchronizedList
private List<HttpSession> list=Collections.synchronizedList(new LinkedList<HttpSession>());
private Object locket=new Object();
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session创建了");
//创建的时候就得到session
HttpSession session=httpSessionEvent.getSession();
synchronized (locket) {
list.add(session);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("Session摧毁了!");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
@Override
public void contextInitialized(ServletContextEvent ServletContextEvent) {
// private List list;
//启动就是执行
//扫描session
//创建计时器
//task是表示要干什么操作
Timer timer=new Timer();
timer.schedule(new MyTask(list,locket), 0 ,60*1000);
//这里面在解决线程安全的时候,采用锁的概念
}
}
class MyTask extends TimerTask{
private List list;
private Object locket;
public MyTask(List list,Object locket){//实例化一个,冲上面带list值来
this.list=list;
this.locket=locket;
}
@Override
public void run() {
//这里面要做的是扫描程序
//采用迭代的方法对list程序进行扫描
synchronized (locket) {
Iterator it=list.iterator();
while (it.hasNext()) {
HttpSession session=(HttpSession) it.next();
//假如当前时间值,减去session值小于60时,调用移除session
if (System.currentTimeMillis()-session.getLastAccessedTime()>=60*1000){
session.invalidate();
it.remove();
}
}
}
}
}
Session监听器处理代码学习
最新推荐文章于 2023-12-10 18:31:58 发布