【问题标题】:Handling HTTP 302 error and redirecting in Backbone.JS "sync" method在 Backbone.JS“同步”方法中处理 HTTP 302 错误和重定向
【发布时间】:2013-01-11 13:47:00
【问题描述】:

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

正如in this answer 所解释的那样,这个 302 响应由浏览器处理(它不会到达我的应用程序)所以返回给我的应用程序的是一个 200 OK 响应,内容类型 =“text/html”(包含登录表单)。

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

this question/answer 的大力帮助下,我重写了Backbone.sync 方法,以便使用我自己的错误处理。但是,由于 302 从未到达我的错误处理程序,我无法自己覆盖重定向。

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

【问题讨论】:

    标签: redirect backbone.js spring-security http-status-code-302


    【解决方案1】:

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

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

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

    【讨论】:

    • +1 用于检测 AJAX 请求,不使用默认重定向到登录页面
    • 在 Spring Security 3.1+ 中,您可以为您的 AJAX URI 定义一个单独的领域(<http> 标签),并将其配置为仅使用基本 HTTP 身份验证(请参阅this answer,但不要制作 AJAX URI无状态 - 不要使用create-session="stateless")。当会话过期时,您将收到这些 URI 的 401 响应。但是,浏览器会提示输入登录名和密码 - 请参阅 this answer(使用 cmets)或 this post 以获得解决方案。
    【解决方案2】:

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

    我认为您可以使用 XHR 的其他一些字段来检测这种情况。一个特殊的 cookie 可以解决问题。

    您可以从 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(...) 实现。

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2017-03-16
      • 2023-03-17
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多