Я бы пошел с фильтром 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). Другой способ заключается в том, как перенаправить браузер на страницу входа в систему или куда вам нужно перейти, когда есть запрос Ajax после 30 минут без активности Ajax. Вам нужно будет обработать JSON или другой ответ, который клиент проверит, чтобы узнать, истек ли он, и выполнить перенаправление на стороне клиента.