我正在使用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始终为null。我怎样才能使这个工作让Spring重定向到正确的页面?
答案 0 :(得分:5)
您不需要编写任何自定义代码,因为Spring Security默认情况下可以执行此操作。请查看有关authentication-success-handler-ref
here。
<强>认证成功处理程序-REF 强>
这可以用作default-target-url和always-use-default-target的替代方法,使您可以在成功进行身份验证后完全控制导航流。该值应该是应用程序上下文中AuthenticationSuccessHandler bean的名称。 默认情况下,使用SavedRequestAwareAuthenticationSuccessHandler的实现并使用default-target-url注入。
引用AuthenticationSuccessHandler bean,该bean应该用于处理成功的身份验证请求。 不应与default-target-url(或always-use-default-target)结合使用,因为实现应始终处理导航到后续目标。
答案 1 :(得分:2)
根据您对上一个答案的评论,我看到了两个选项。
创建一个自定义的RequestCache,例如通过扩展HttpSessionRequestCache并避免在该缓存上放置ajax请求,登录时你应该被重定向到最后没有Ajax请求
实现您自己的RedirectStrategy以发送将由您的客户端代码解释的自定义ajax响应。在某些情况下,设置自定义RedirectStrategy并不容易,因为不同元素没有配置属性,例如,在SessionManagementFilter的情况下,您需要创建自己的实例并设置自定义重定向策略
我希望它有所帮助