在我的应用程序中,我使用的是Spring Security 3.0,在用于拦截“身份验证后”的类中,我有类似以下内容:
public class CustomAuthenticationHandler extends SavedRequestAwareAuthenticationSuccessHandler {
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
...
}
}
<security:http>
<security:form-login login-page="/login/" always-use-default-target="false" authentication-success-handler-ref="customAuthenticationHandler" authentication-failure-url="/login/?login_error=1"/>
...
</security:http>
<bean id="customAuthenticationHandler" class="org.myproject.CustomAuthenticationHandler"/>
当我从应用程序内的通用页面“ X”登录时,我希望在成功通过身份验证后重定向到“ X”,但是我总是登录到主页。
上面的“ savedRequest”变量始终返回null。是否缺少任何特定设置?如何获得正确的重定向?
最佳答案
这实际上取决于您的意思是“从应用程序内的通用页面“ X”登录”。
如果您是说您已经在查看该页面,然后选择访问登录页面(或者您具有嵌入式登录表单),那么您将不会被重定向到页面“ X”,因为Spring Security不知道您是哪个页面。当您决定登录时。您将不得不重定向到Referer
标头给出的位置,或将页面浏览历史记录存储在应用程序逻辑中。SavedRequest
机制仅在您尝试访问受保护资源并且Spring Security需要将您重定向到登录页面的情况下使用。它会临时记录该位置,以便它可以在登录后尝试恢复原始请求行为。
如果“ X”是受保护的页面,而您试图查看它,则在您重定向到登录页面时,URL为“ X”的SavedRequest
将被缓存在会话中。