【问题标题】:Spring Security 3.0 Redirect to page that timed outSpring Security 3.0 重定向到超时的页面
【发布时间】:2012-05-21 20:03:23
【问题描述】:

我正在使用 Spring Security 3.0.6,我希望能够执行以下操作:

如果用户在页面上并且发生会话超时,则用户将被带到登录页面并在有效登录时重定向回发生超时的页面。

我的 security.xml 文件中目前有以下内容。

<http auto-config="true" use-expressions="true">
    <form-login
        login-page="/login" 
        default-target-url="/main" 
        always-use-default-target="false"
        authentication-failure-url="/login.html?error=true"
        authentication-success-handler-ref="authenticationSuccessHandler" />
    <remember-me/>
    <logout logout-success-url="/login" />
</http>

这是我的认证类:

public class AuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {

    String url = "";

    HttpSession session = request.getSession(false);
    if (session != null) {
        SavedRequest savedRequest = (SavedRequest) session.getAttribute(WebAttributes.SAVED_REQUEST);
        if (savedRequest != null) {
            url = savedRequest.getRedirectUrl();
        }
    }

    System.out.println("url: "+ url);

    if (url == "") {
        response.sendRedirect(request.getContextPath()+"/main");
    } else {
        response.sendRedirect(url);
    }
}

}

我通过 javascript 将用户发送回登录页面,例如:

window.location.href="/login";

在我的身份验证类中,url 始终为空。我怎样才能使这项工作,以便 Spring 将重定向到正确的页面?

【问题讨论】:

    标签: java spring security redirect


    【解决方案1】:

    您不需要编写任何自定义代码,因为默认情况下 Spring Security 可以做到这一点。查看有关 authentication-success-handler-ref here 的文档。

    authentication-success-handler-ref

    这可以用作 default-target-url 和 always-use-default-target 的替代方案,让您在成功验证后完全控制导航流程。该值应该是应用程序上下文中的 AuthenticationSuccessHandler bean 的名称。 默认使用SavedRequestAwareAuthenticationSuccessHandler的实现并注入default-target-url。

    对 AuthenticationSuccessHandler bean 的引用,该 bean 应该用于处理成功的身份验证请求。 不应与 default-target-url(或 always-use-default-target)结合使用,因为实现应始终处理到后续目的地的导航。

    【讨论】:

    • 感谢您的回复。默认情况下spring是如何处理的?如果用户第一次进入登录页面,我需要将他们定向到 /main。如果他们从另一个页面超时,我需要他们转到 /anotherpage。如何使用 SavedRequestAwareAuthenticationSuccessHandler 实现这一点?一个代码示例会很有帮助。谢谢
    • 如果你没有定义authentication-success-handler-ref,这是Spring的通常行为。只需将其从您的配置中删除即可。
    • 我想我误解了一些东西。我删除了身份验证成功处理程序引用。 spring如何知道哪个页面导致超时?我想在登录屏幕后被重定向回该页面。我试过了,登录后它一直把我带到正常的默认屏幕。
    • 超时不是由页面引起的,而是由用户不活动引起的。如果会话已过期并且用户请求任何需要身份验证的页面,将显示登录表单。登录后,用户将被带到他在会话到期后请求的页面,而不是他在超时发生时所在的页面。
    • 好的,我现在明白了。谢谢你的解释。我认为我的问题是我没有请求另一个页面。我做一个 ajax 调用来更新同一页面上的内容。我可以在控制器中添加什么吗?
    【解决方案2】:

    从上一个答案的 cmets 中,我看到了 2 个选项。

    1. 创建一个自定义的 RequestCache,例如通过扩展 HttpSessionRequestCache 并避免将 ajax 请求放在该缓存上,您在登录时应该被重定向到最后一个无 Ajax 请求

    2. 实现您自己的 RedirectStrategy 以发送将由您的客户端代码解释的自定义 ajax 响应。在某些情况下,设置自定义 RedirectStrategy 并不容易,因为没有针对不同元素的配置属性,例如,在 SessionManagementFilter 的情况下,您需要创建自己的实例并设置自定义重定向策略

      李>

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-30
      • 2011-08-08
      • 1970-01-01
      • 2012-09-12
      • 2014-12-01
      • 2014-06-05
      • 2012-09-25
      • 2014-07-22
      相关资源
      最近更新 更多