package cn.lnu.web.listener.example;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//�Զ���sessionɨ����
public class SessionScannerListener implements HttpSessionListener ,ServletContextListener{
private List<HttpSession> list=Collections.synchronizedList(new LinkedList<HttpSession>());
private Object lock=new Object();//����һ�����������δ��빲��
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session=se.getSession();
System.out.println(session+"������");
synchronized(lock){//���û���½����������µ�Ԫ��ʱ�����õ�ͬ�������������
list.add(session);//�����̰߳�ȫ����,����ʹ��Collections.synchronizedList(List<T>)�Ϳ��Է���һ���̰߳�ȫ��list
}
}
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println(se.getSession()+"���ݻ�");
}
//Ϊ��ʵ��ÿ�����ɨ��һ��session��û�����ã�������Ҫ����һ����ʱ�����������ʱ����Ҫ����webӦ�õ����������������Ի���Ҫʵ��ServletContextListener�ӿڣ�ʵ�ֶ�ʱ���Ĵ�����session��ɨ��
public void contextInitialized(ServletContextEvent sce) {//webӦ��������ʱ��������ʱ��
// TODO Auto-generated method stub
//����һ����ʱ��
Timer timer=new Timer();
timer.schedule(new myTask(list,lock), 0, 1*60*1000);//��ͬ����lockҲ���ݹ�ȥ
}
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
}
//����������ÿ��5����ɨ��һ��list��ϣ���������е�Ԫ��session����������˷��ʾʹӼ�����ɾ��
class myTask extends TimerTask{
private List list;
private Object lock;//�������û���¼��վ���session����ŵ�һ��ͬ��������У����Դ˴�����Ҫ����һ��ͬ����
myTask(List list,Object lock){
this.list=list;
this.lock=lock;
}
@Override
public void run() {
//System.out.println("��ʱ��ִ�У�");
synchronized(this.lock){//�����ڵ�����������ʱ���û��µ�¼����������µ�session������������ʱҲ��֪���������������쳣
//Iterator it=list.iterator();//��ü��ϵĵ�����
ListIterator it=list.listIterator();
while(it.hasNext()){
HttpSession session=(HttpSession) it.next();
if((System.currentTimeMillis()-session.getLastAccessedTime())>1*60*1000){
session.invalidate();//������session5������û�˷��ʾʹݻ���
//list.remove(session);//������ڼ��ϵ����Ĺ�����ɾ��Ԫ�أ���ʱ����������֪������������(����ָɾ��Ԫ��)�����׳�һ���������쳣��
it.remove();//���ڵ�ǰ���������ڵ������session���������Dz���Ҫ���ݲ���session��remove����
}
}
}
}
}