小编典典
我将使用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