我有一个现有的Grails Web应用程序正在生产中,会话超时为30分钟。我们正在运行Tomcat(tcServer)。
当用户通过身份验证并在某些页面上时,我想向服务器发出一些不会延长30分钟会话超时的定期轮询ajax请求-这样我们的会话超时就不会受到影响。 这尚未解决的asp.net问题类似,但是在Java / Tomcat领域中,没有一个答案可以做到。
我如何执行经过身份验证的AJAX请求,而不重置Tomcat的会话超时?
是否可以使用某种过滤器或URL匹配机制来排除请求以延长会话超时?
我将使用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或客户端会检查的其他响应,以知道它已超时并执行客户端重定向。