判断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) { } }
相关文章推荐
- 一个判断session是否过期的小技巧
- 一个判断session是否过期的小技巧
- 判断用户session 是否过期,如果过期,让用户重新登录
- ASP.NET Session丢失问题解决方案总结及判断Session是否过期
- 一个判断session是否过期的小技巧_Java
- ASP.NET Session丢失问题解决方案总结及判断Session是否过期【转载】
- 一个判断session是否过期的小技巧
- 一个判断session是否过期的小技巧
- 一个判断session是否过期的小技巧
- asp.net 判断session是否过期
- 【小技巧】一个判断session是否过期的小技巧
- 判断session是否过期
- 一个判断session是否过期的小技巧
- 基类里判断Session是否过期(转载)
- 一个判断session是否过期的小技巧
- 一个判断session是否过期的小技巧
- 判断一个session是否过期
- ASP.NET Session丢失问题解决方案总结及判断Session是否过期【转载】
- ASP.NET Session丢失问题解决方案总结及判断Session是否过期
- 判断session是否过期