您的位置:首页 > 其它

判断session是否过期

2015-01-25 15:08 309 查看
<pre name="code" class="java">package listener;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
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;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

import util.WriteTxt;

public class SessionScanner implements HttpSessionListener,
ServletContextListener
{
//并发向集合中增加元素,通过Collections.synchronized构建线程安全的集合
private static final List<HttpSession> SESSIONS = Collections
.synchronizedList(new LinkedList<HttpSession>());
//将增加方法和迭代方法放在一个同步代码块中,后面的两个同步代码块使用相同的锁旗标对象LOCK,防止并发异常
private final static Object LOCK = new Object();
//项目的根目录
private static  String ROOT  ;

public void sessionCreated(HttpSessionEvent se)
{

synchronized (LOCK)
{

SESSIONS.add(se.getSession());
}
}

public void sessionDestroyed(HttpSessionEvent se)
{
//System.out.println("SessionScanner——Session摧毁了");
}

public void contextInitialized(ServletContextEvent sce)
{

ROOT = sce.getServletContext().getRealPath("/");
//利用定时器来定时遍历这个集合中的所有 Session
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
public void run()
{
//有效的session数目,这里的有效通过session中是否有username来判断
synchronized (LOCK)
{
int num=0;
//对集合的操作应该用迭代器来操作集合最合适
Iterator<HttpSession> iterator = SESSIONS.iterator();
while (iterator.hasNext())
{

HttpSession session = iterator.next();

//System.out.println(session.getLastAccessedTime());
//System.out.println(System.currentTimeMillis());
//得到 Session 的 lastAccessedTime 从而进行判断失效session
try
{
//session有效且有 username就 num++,如果无效会抛出异常
if(session.getAttribute("username")!=null) num++;
//session超过20分钟没有活动,则注销
if (  System.currentTimeMillis()
- session.getLastAccessedTime()> 20*60*1000 )
{
session.invalidate();
iterator.remove();
}
}
//捕获到session已注销,但是还是 session.getLastAccessedTime 抛出的异常
catch(IllegalStateException e)
{
System.out.println("session已经注销过");
iterator.remove();
}
catch(Exception e)
{
System.out.println("session再次注销");
iterator.remove();
}

}

}

}
}, 0, 3*1000);
}

public void contextDestroyed(ServletContextEvent sce)
{
}

}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: