Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测过期会话与无会话_Java_Spring_Tomcat_Filter_Listener - Fatal编程技术网

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

Java 如何检测过期会话与无会话,java,spring,tomcat,filter,listener,Java,Spring,Tomcat,Filter,Listener,要求是:当用户会话过期时,调用expired.htm页面,但在第一次连接到网站时,显示login.htm 我试着使用一个过滤器,但它不起作用,我无法告诉过滤器如何理解它是一个新的请求还是一个旧的请求过期了。这是我使用的代码: if (session.getAttribute("userProfile") == null) { logger.debug("Session: " + ( session.isNew() ? "true" : "false")); logger.deb

要求是:当用户会话过期时,调用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和普通internet上尝试了这里提出的不同解决方案,但没有任何效果,每个请求都会转到
expired.htm

如何获取会话对象?在进行此操作之前,请使用

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

在会话中使用任何属性之前,需要使用上面的验证。因为如果会话不存在,就无法获取它的属性。 你需要在parentesis中输入false

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

公共HttpSession getSession(布尔创建)

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

与此请求关联的HttpSession,如果create为false且请求没有有效会话,则为null

我想说,如果用户发送了无效会话id,则可以认为会话已过期,也就是说,为了获得id,用户必须已经访问过该站点,或者已经复制了一个带有会话id的链接。我还选中了isNew,但在会话过期时它始终为true(我激活了一个侦听器,在会话过期时显示我)