在我的应用程序中,我使用的是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将被缓存在会话中。

07-24 19:17