세션 스캐너 사용자 정의

2494 단어
서버가 세션의 파괴를 정확하게 관리하지 않기 때문에, 어느 시간 안에 세션을 정확하게 파괴하기 위해서는 사용자 정의 세션 스캐너가 필요합니다. 서버의 모든 세션은 우리가 관리하는 프로그램을 써야 합니다. 어떤 세션이 1분간 아무도 사용하지 않는 것을 발견하면, 우리는 그것을 파괴할 것입니다. 서버가 우리를 도와 파괴하지 마십시오.
사고방식: 우리는 모든session을 관리해야 한다. 우리는 감청기를 써야 한다. 감청기가 session의 생성을 들으면 내 용기에 넣고 스캐너를 켜서 1분간 쓸모없는 session을 스캔하면 파괴한다.
코드는 다음과 같습니다.
package cn.test.web.listener;

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.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionScanerListener implements HttpSessionListener,ServletContextListener {

	// session 
	private List list = Collections.synchronizedList(new LinkedList<HttpSession>());
	private Object lock = new Object();
	
	// web 
	public void contextInitialized(ServletContextEvent sce) {
		Timer timer = new Timer();
		//  0 , 1 
		timer.schedule(new MyTimerTask(list,lock), 0, 1000*1);
	}
	
	public void sessionCreated(HttpSessionEvent se) {
		HttpSession session = se.getSession();// session
		System.out.println("session !!");
		synchronized (lock) {  // 
			list.add(session);  // session 
		}
	}
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("session !!");

	}
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}
}

class MyTimerTask extends TimerTask{
	private List list;
	private Object lock;
	public MyTimerTask(List list,Object lock){
		this.list = list;
		this.lock = lock;
	}
	// 
	@Override
	public void run() {
		synchronized (lock) {
			if(list!=null){
				Iterator<HttpSession> it = list.iterator();  //5
				while(it.hasNext()){
					HttpSession session = it.next();
					// session session
					if(System.currentTimeMillis()-session.getLastAccessedTime()>1000*60){
						it.remove();
						session.invalidate();
					}
				}
			}
		}
	}
}

좋은 웹페이지 즐겨찾기