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

标签 java ajax tomcat grails session-timeout

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

当用户通过身份验证并在某些页面上时,我想向服务器发出一些定期轮询 ajax 请求,这些请求不会延长这 30 分钟的 session 超时 - 这样我们的 session 超时就不会受到阻碍。

问题类似于this unanswered asp.net question ,但在 Java/Tomcat 领域中,没有任何答案可以解决这个问题。

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

是否有某种过滤器或 url 匹配机制可用于排除请求以延长 session 超时?

最佳答案

我会选择一个 Grails 过滤器,它可以做一些类似于 The-MeLLeR 所提议的事情,而无需在所有 session 中进行不必要的循环:

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
         }
      }
   }
}

session 超时应该依赖注入(inject)或以其他方式与 web.xml 中的值保持同步。

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

关于java - 如何在不重置 tomcat session 超时的情况下执行经过身份验证的 AJAX 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4834270/

相关文章:

java - ComboBox 将所有值加在一起作为一个值

java - 如何在 Java 流中配对不均匀列表

php - 如何使用 jquery php 保存动态添加的行?

javascript - 使用 JQuery、ExpressJS 和 AJAX 更新 MongoDB

java - eclipse : use Struts Actions of imported Project

java - SOAP 响应配对

java - 将 Double 转换为 java.sql.Time

tomcat - 我可以限制 tomcat7 中的应用程序日志大小吗?

java - 单击复选框后面板重新加载

eclipse - java.io.FileNotFoundException : C:\Program Files\Apache Software Foundation\Tomcat 7. 0\logs\localhost_access_log.2012-07-12.txt(拒绝访问)