我正在编写使用 Sprint Security 进行身份验证的 Grails 应用程序。我需要向由于不活动而自动注销的用户显示一条消息。
我的应用程序同时使用 AJAX 请求和对控制器的直接请求。我注意到,对于 AJAX 请求,Sprint Security 返回带有代码 401 的 HTTP 响应,并且我以这种方式重新定义了默认 URL 映射:
class UrlMappings {
static mappings = {
// ...
"401" (controller: 'errors', action: 'inactivityLogout')
}
}
这是inacticityLogout()
方法的主体:
def inactivityLogout() {
log.debug("the user is logged out due to inactivity")
session.setAttribute('inactivityMessage', "You have been logged out due to inactivity.")
render(status: 401)
}
然后LoginController
检查是否inactivityMessage
设置了属性,并在登录页面上显示相应的消息。
问题是这个解决方案适用于 AJAX 调用,但是当我试图通过单击应用程序中的直接链接导航到另一个页面时不起作用。在第二种情况下,日志为空,因此inactivityLogout
不调用该方法。
Firebug 显示应用程序返回代码 302 已临时移动,所以我认为这是一个原因。但后来我注意到 AJAX 调用也返回了相同的代码。所以,现在我不知道 AJAX 和非 AJAX 请求之间有什么区别,以及为什么 Grails URL 映射引擎不处理最后一个请求。
任何想法,我目前的解决方案可能有什么问题?这个问题可以用完全不同的方式解决吗?
谢谢!