判断session是否过期

前一段时间有好几个问题,提到怎么判断session是否过期。  
接触jspo已经很久了,但是还真没有想过这个问题,当时也就没有找到一个满意的答案给人家。  
当时,我提到一个方法,就是实现HttpSessionListener接口,然后在sessionDestroyed()方法中执行一些操作,表示session要过期了,因为这个方法是session.invalidate()之前监听器调用的方法。这个判断的方法显然不能让人满意。  
我当时问了些人,但是也没有得到一个准确的答案。  
正好偶然间看到,request.getSeesion(boolean)方法,一下子让我恍然大悟。这个方法里面传了一个boolean值,这个值如果是true,那么如果当前的request的session不可用,那么就创建新的会话,如果存在就返回当前的会话。如果参数是false,那么在request的当前会话不存在的时候就返回null。  
这样我们就可以很容易的联想到这个所谓的request的当前会话是否存在和session过期的联系,所以我们就可以“近似地”认为session不存在就是session过期了,那么我们就可以很容易地判断session是否过期了。方法如下:  
if(request.getSession(false)==null)  
     System.out.println("Session  has  been  invalidated!");  
else  
     System.out.println("Session  is  active!");  
 
可能大家注意到我上面有一个“近似地”字眼,也就是说存在特别情况。  
这个特殊情况就是第一次请求还没有创建会话的时候,那么用这个方法返回的仍然是null,原因我想大家应该是显然的。  
 
以上是个人拙见,希望大家指正。  
---------------------------------------------------------------  
刚才有很多兄弟跟我探讨用javax.servlet.http.HttpSessionBindingListener接口来实现类似功能  
他们的意思是当session创建的时候session.setAttribute("isActive","yes");只要session没有过期,那么我们就可以session.getAttribute("isActive")==null来判断,但是我们如果在过期以后就不能用这个办法了,因为我们使用过期的session.getAttribute()方法就会抛出java.lang.IllegalStateException,这时候我们就只能通过捕捉这个异常来进行判断,这就会打乱我们整个程序的逻辑流程。  
当然我们也可以在session过期的时候这样处理,在HttpSessionBindingListener接口的onValueUnbound()方法里面通过设置一个flag来标志session已过期,之后盘都都使用这个flag,那么这个flag一定是要放在application里面,application是HttpServletContex类的对象,所以我们必须对这个flag加入是哪个session过期的信息,这样一来整个的过程就十分麻烦。  
写这个帖子的目的就是让大家在需要判断的时候(不管session是否过期都OK)用这样的一条语句来简单的实现功能,至于意义我们姑且不谈。  
 
---------------------------------------------------------------  
 
俺也没看明白,今看老兄一贴,茅塞顿开  
真实“看一贴长一智谢谢啊”  
private  boolean  checkSession(            HttpServletRequest  request,  
                                                                                                           HttpServletResponse  response)  {  
                       HttpSession  session  =  request.getSession(false);  
                       String  requestURI  =  request.getRequestURI();  
                       String  contextPath  =  request.getContextPath();  
                         
                       requestURI  =  requestURI.substring(contextPath.length());  
                         
                       if(requestURI.equals("/")    ¦  ¦  
                                               requestURI.equals("/login.jsp")    ¦  ¦  
                                                 requestURI.equals("/login.do")              ¦  ¦  
                                                 requestURI.equals(this.errorPage))  
                                   return  true;  
                         
                       if(session  !=  null    
                                               &&  session.getAttribute(this.objName)  !=  null    
                                               &&  session.getAttribute("year")  !=  null)  
                                   return  true;  
                       else    
                                   return  false;  
           }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值