Session监听器处理代码学习

来源:互联网 发布:crontab 执行php延迟 编辑:程序博客网 时间:2024/06/05 01:02
 
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.synchronizedListprivate List<HttpSession> list=Collections.synchronizedList(new LinkedList<HttpSession>());private Object locket=new Object();@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {System.out.println("session创建了");//创建的时候就得到sessionHttpSession session=httpSessionEvent.getSession();synchronized (locket) {list.add(session);}}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {System.out.println("Session摧毁了!");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {}@Overridepublic 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;}@Overridepublic 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();}}}}}

原创粉丝点击