<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)
{
}
}
判断session是否过期
最新推荐文章于 2021-02-21 10:45:54 发布