【问题标题】:Redirect url to the last accessed page instead of home page using spring使用spring将url重定向到最后访问的页面而不是主页
【发布时间】:2017-05-04 05:04:15
【问题描述】:

我使用的是 Spring 3.1 版本。

我已经实现了 Spring Security 以登录我的门户网站。它工作正常,除了一个问题。我已将会话超时设置为 2 分钟。

一旦发生超时,然后用户单击任何 URL,它就会被重定向到注销页面。但是当用户重新认证时,用户直接登陆默认目标URL的主页而不是最后访问页面。

如果用户访问/home/editproduct,那么在超时后&当他再次重新验证时,他应该访问home/editproduct,而不仅仅是/home页面。

这是我的 applicationcontext.xml 文件:

<bean id="myNeAdminUserNamePasswordAuthFilter"
    class="com.ne.mynelson.authentication.adminuser.MyNeAdminUserPasswordAuthFilter">
        <property name="authenticationManager" ref="myNeAdminUserAuthManager" />
        <property name="authenticationFailureHandler" ref="adminFailureHandler" />
        <property name="authenticationSuccessHandler" ref="adminSuccessHandler" />

        <property name="authenticationInputProcessor" ref="myNeAdminUserAuthInputProcessor"></property>
    </bean>

<bean id="adminSuccessHandler"
        class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
        <property name="defaultTargetUrl" value="/bookShelfController.htm" />

         <property name="useReferer" value="true"/>    
    </bean>
<bean id="adminFailureHandler"
        class="com.ne.mynelson.authentication.adminuser.AdminUrlAuthenticationFailureHandler">
        <property name="defaultFailureUrl" value="/adminlogin.htm"></property>
    </bean>

【问题讨论】:

标签: spring-security


【解决方案1】:

您可以使用SavedRequestAwareAuthenticationSuccessHandler 代替SimpleUrlAuthenticationSuccessHandler

ExceptionTranslationFilter会在重定向到入口点之前将请求保存到RequestCacheSavedRequestAwareAuthenticationSuccessHandler会尝试获取请求的目标url,然后重定向到保存的url。

<bean id="adminSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler" />

More see here

【讨论】:

  • 您好,我添加了一个自定义 sucessHandler 并从 SavedRequestAwareAuthenticationSuccessHandler 实现该类,这对我来说效果很好。
【解决方案2】:

我已经这样做了,这对我来说似乎很好

public class AdminUrlAutenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler/*SimpleUrlAuthenticationSuccessHandler*/ {
    //private String defaultFailureUrl;
    private RequestCache requestCache = new HttpSessionRequestCache();

    public RequestCache getRequestCache() {
        return requestCache;
    }

    public void setRequestCache(RequestCache requestCache) {
        this.requestCache = requestCache;
    }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws ServletException, IOException {
    SavedRequest savedRequest = requestCache.getRequest(request, response);

    if (savedRequest == null) {
        HttpSession session = request.getSession();
        if (session != null) {
            String redirectUrl = (String) session.getAttribute("url_prior_login");
            if (redirectUrl != null) {
                session.removeAttribute("url_prior_login");
                getRedirectStrategy().sendRedirect(request, response, redirectUrl);
            } else {
                super.onAuthenticationSuccess(request, response, authentication);
            }
        } else {
            super.onAuthenticationSuccess(request, response, authentication);
        }

        return;
    }

    String targetUrlParameter = getTargetUrlParameter();
    if (isAlwaysUseDefaultTargetUrl()
            || (targetUrlParameter != null && StringUtils.hasText(request.getParameter(targetUrlParameter)))) {
        requestCache.removeRequest(request, response);
        super.onAuthenticationSuccess(request, response, authentication);

        return;
    }

    clearAuthenticationAttributes(request);

    // Use the DefaultSavedRequest URL
    String targetUrl = savedRequest.getRedirectUrl();
    logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl);
    getRedirectStrategy().sendRedirect(request, response, targetUrl);
}
}

Application-context.xml 文件

<bean id="myNeAdminUserNamePasswordAuthFilter"
 class="com.ne.mynelson.authentication.adminuser.MyNeAdminUserPasswordAuthFilter">
        <property name="authenticationManager" ref="myNeAdminUserAuthManager" />
        <property name="authenticationFailureHandler" ref="adminFailureHandler" />
        <property name="authenticationSuccessHandler" ref="adminSuccessHandler" />

        <property name="authenticationInputProcessor" ref="myNeAdminUserAuthInputProcessor"></property>
    </bean>


<bean id="adminSuccessHandler"
        class="com.ne.mynelson.authentication.adminuser.AdminUrlAutenticationSuccessHandler">
        <property name="defaultTargetUrl" value="/bookShelfController.htm" />
         <property name="targetUrlParameter" value="spring-security-redirect"/>   
         <property name="useReferer" value="false"/>    
    </bean>
    <bean id="adminFailureHandler"    class="com.ne.mynelson.authentication.adminuser.AdminUrlAuthenticationFailureHandler">
        <property name="defaultFailureUrl" value="/adminlogin.htm"></property>
    </bean>

任何建议如何以不同的方式做到这一点。

【讨论】:

  • 您何时将“url_prior_login”设置为会话?我认为使用SavedRequestAwareAuthenticationSuccessHandler 是可以的,为什么你需要再次覆盖?
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 2010-12-06
  • 2015-04-17
  • 2013-07-07
  • 2021-10-18
  • 2012-06-22
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多