判断session是否过期

<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)
    {
    }
    
   
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值