4

我有一个受保护的 Backbone.js 应用程序(使用Spring 安全性atm。),因此登录用户必须具有有效的会话 cookie (JSESSIONID)。现在,如果此会话无效(删除、过期等)并且用户尝试发出请求,Spring 安全性将返回 302 错误以尝试将用户重定向到登录表单。

正如这个答案中所解释的,这个 302 响应由浏览器处理(它没有到达我的应用程序)所以返回给我的应用程序的是一个 200 OK 响应,内容类型 =“text/html”(包含登录表单) .

这是一个问题,因为当我的 Backbone 模型尝试同步到 url 时,它需要 JSON。如果在没有有效会话的情况下发生此同步,则在需要“application/json”时返回 200“text/html”响应,从而在jQuery.extend.parseJSON.

这个问题/答案的大力帮助下,我重写了该Backbone.sync方法以使用我自己的错误处理。但是,由于 302 从未到达我的错误处理程序,我无法自己覆盖重定向。

我的情况与这个问题非常相似,但是从未发布过该问题的最终解决方案。有人可以帮我找出确保重定向到登录页面的理想方法吗?

4

2 回答 2

3

HTTP 200 OK您应该将 Spring Security 配置为返回HTTP 401 Unauthorized未经身份验证的 AJAX 请求,而不是返回登录页面。您可以通过检查X-Requested-With: XMLHttpRequest请求标头来检测 AJAX 请求(与普通页面请求相反)。

您可以使用全局$.ajaxError处理程序来检查401错误并重定向到那里的登录页面。

这就是我们实现它的方式,并且效果很好。不过,我不是 Spring 人,所以我对 Spring Security 配置无能为力。

于 2013-01-11T16:10:41.637 回答
0

编辑。而不是自定义 coockie,最好使用@fencliff 提供的解决方案。

我认为您可以使用 XHR 的其他一些领域来检测这种情况。一个特殊的饼干可能会成功。

您可以从 Spring Security 端定义自己的身份验证失败处理程序。在重定向到登录页面的那一刻,您将能够向 HttpServletResponse 添加一些 cookie。您的自定义 Backbone.sync 方法将检查此 cookie。如果它存在,它将为这种情况启动您的自定义处理程序(不要忘记同时删除 cookie)。

<sec:http ... >
    <sec:form-login login-page='/login.html' authentication-failure-handler-ref="customAuthenticationFailureHandler" />
</sec:http>

<bean id="customAuthenticationFailureHandler" class="com.domain.CustomAuthenticationFailureHandler" />

CustomAuthenticationFailureHandler 必须实现 org.springframework.security.web.authentication.AuthenticationFailureHandler 接口。您可以添加您的 coockie,然后调用默认的 SimpleUrlAuthenticationFailureHandler.onAuthenticationFailure(...) 实现。

于 2013-01-11T14:18:56.433 回答