1

我正在编写使用 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 映射引擎不处理最后一个请求。

任何想法,我目前的解决方案可能有什么问题?这个问题可以用完全不同的方式解决吗?

谢谢!

4

2 回答 2

2

使用 jQuery,这就是我所做的:

$.ajaxSetup({
   statusCode: {
     401: function () {
       $('#ajaxAuthModal').modal('show');
     }
   }
});

我在一个全局 JS 文件中有它,这样我的所有 ajax 请求都可以处理 401。然后我只显示一个模式,告诉用户他们需要再次登录。实现所需的唯一真正区别是通过 ajax 轮询安全资源。这将允许 401 函数在返回 401 时触发。

大多数 JavaScript 库(如 jQuery)应该具有与$.ajaxSetup().

于 2013-01-09T19:01:05.520 回答
1

是的,这个想法是在没有任何用户交互的情况下显示消息。只是想让用户知道他为什么退出系统。

所以基本上一旦用户加载了页面,就没有与服务器的联系。服务器无法将消息“推送”到浏览器。因此,您需要做的是检查是否存在与 JavaScript 的活动会话。你可以很容易地用计时器来做到这一点。

在您的 main.gsp 中将 javascript 变量设置为${session.maxInactiveInterval}. 这将为您提供用户会话的最大长度。只需启动一个setTimeout( function() { /* code to display to the user here */ }, maxInterval).

记住要重置 AJAX 调用的时间间隔,因为由于页面没有被重新加载,它不会被重置。

附带说明一下,URL 映射应该只在非 AJAX 请求上发挥作用,因为页面没有被重新加载,因此没有任何东西可以显示页面。您将不得不使用 @Gregg 之类的东西来处理 AJAX 请求。

于 2013-01-10T04:55:29.740 回答