如何检测过期会话与无会话

时间:2013-12-10 18:21:20

标签: java spring tomcat filter listener

要求如下:当用户会话过期时,请调用expired.htm页面,但在第一次连接到网站时,请显示login.htm。

我尝试使用过滤器,但它不起作用,我无法告诉过滤器如何理解它是新请求还是旧请求已过期。这是我使用的代码:

if (session.getAttribute("userProfile") == null) {

    logger.debug("Session: " + ( session.isNew() ? "true" : "false"));
    logger.debug(request.getSession().isNew()); 

    if ( request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid() )  {
        return new ModelAndView("redirect:expired.htm");
    } else {
        return new ModelAndView("redirect:login.htm");
    }


}

我在Stack Overflow和一般互联网上尝试了不同的解决方案,但没有任何工作,每个请求都转到expired.htm

2 个答案:

答案 0 :(得分:0)

你如何获得会话对象?在此之前,请使用

if (request.getSession(false)==null) {
  // no session present (expired or new visitor)
  [... do something ...]
} else {
  // active session present
}

答案 1 :(得分:0)

在使用会话中的任何属性之前,您需要使用上面的验证。因为如果会话不存在,则无法获取它的属性。 你需要把假药放在肠胃外。

if(request.getSession(false) == null) { //Session don't exists
...
}

Java解释:

public HttpSession getSession(boolean create)

返回与此请求关联的当前HttpSession,如果没有当前会话且create为true,则返回新会话。
如果create为false且请求没有有效的HttpSession,则此方法返回null。
要确保正确维护会话,必须在提交响应之前调用此方法。如果容器使用cookie来维护会话完整性,并且在响应提交时要求创建新会话,则抛出IllegalStateException。
参数:
create - 如果需要,为true以为此请求创建新会话;如果没有当前会话,则返回false
返回:
与此请求关联的HttpSession,如果create为false且请求没有有效会话,则返回null