如何在不重置tomcat的会话超时的情况下执行经过身份验证的AJAX请求?

Col*_*ton 8 java ajax grails tomcat session-timeout

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

当用户通过身份验证并在某些页面上时,我想要定期轮询对服务器的ajax请求,这些请求不会延长这个30分钟的会话超时 - 这样我们的会话超时就不会被阻止.

问题类似于这个未经回答的asp.net问题,但是在Java/Tomcat领域中没有任何答案可以做到这一点.

如何在不重置tomcat的会话超时的情况下执行经过身份验证的AJAX请求?

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

Bur*_*ith 4

我会使用 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
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

会话超时应该是依赖注入的或以其他方式与 web.xml 中的值保持同步。

还有两个问题尚待解决。一种情况是存在 Ajax 请求,但之前没有非 Ajax 请求 (lastAccess == null)。另一个是当 30 分钟没有非 Ajax 活动后出现 Ajax 请求时,如何将浏览器重定向到登录页面或任何您需要去的地方。您必须呈现 JSON 或其他一些响应,客户端将检查这些响应以了解它是否已超时并执行客户端重定向。