一尘不染

我如何执行经过身份验证的AJAX请求,而不重置Tomcat的会话超时?

tomcat

我有一个现有的Grails Web应用程序正在生产中,会话超时为30分钟。我们正在运行Tomcat(tcServer)。

当用户通过身份验证并在某些页面上时,我想向服务器发出一些不会延长30分钟会话超时的定期轮询ajax请求-这样我们的会话超时就不会受到影响。
这尚未解决的asp.net问题类似,但是在Java / Tomcat领域中,没有一个答案可以做到。

我如何执行经过身份验证的AJAX请求,而不重置Tomcat的会话超时?

是否可以使用某种过滤器或URL匹配机制来排除请求以延长会话超时?


阅读 313

收藏
2020-06-16

共1个答案

一尘不染

我将使用Grails过滤器,该过滤器的功能类似于The-MeLLeR所建议的,而不会在所有会话中造成不必要的循环:

class AjaxTimeoutFilters {

   int sessionTimeout = 30 * 60 * 1000
   private static final String TIMEOUT_KEY = 'TIMEOUT_KEY'

   def filters = {
      all(controller:'*', action:'*') {
         before = {
            if (request.xhr) {
               Long lastAccess = session[TIMEOUT_KEY]
               if (lastAccess == null) {
                  // TODO
                  return false
               }
               if (System.currentTimeMillis() - lastAccess > sessionTimeout) {
                  session.invalidate()
                  // TODO - render response to trigger client redirect
                  return false
               }
            }
            else {
               session[TIMEOUT_KEY] = System.currentTimeMillis()
            }

            true
         }
      }
   }
}

会话超时应注入依赖项,否则应与web.xml中的值保持同步。

剩下两个问题。一种情况是有一个Ajax请求,但是没有以前的非Ajax请求(lastAccess ==
null)。另一个是如何将浏览器重定向到登录页面,或者在30分钟无非Ajax活动后有Ajax请求时您需要去的地方。您必须呈现JSON或客户端会检查的其他响应,以知道它已超时并执行客户端重定向。

2020-06-16