我正在建立一个有2页的网站。食谱列表页面,食谱详细信息页面和登录页面。用户可以通过单击食谱列表页面或食谱详细信息页面上的登录按钮来登录网站。当用户单击登录按钮时,该用户将被带到登录页面。如果用户单击配方详细信息页面上的登录按钮,我想将用户再次重定向回配方详细信息页面,如果用户单击配方列表页面中的登录按钮,则将用户重定向至配方列表页面。

我在Controller类中编写了此方法。每当用户登录网站时,都会调用此方法。我将引荐来源网址存储到会话中。将该URL保存到会话中的目的是跟踪用户单击登录按钮的页面。并将用户重定向到我编写的身份验证处理程序中的页面。

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String openLoginPage(Model uiModel, HttpServletRequest request) {



    String referrer = request.getHeader("Referer");

    request.getSession().setAttribute("url_prior_login", referrer);

    return RECIPE_LOGIN_PAGE;
}

我还创建了一个名为SuccessHandler的身份验证处理程序类。
public class SuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

/*
 * (non-Javadoc)
 *
 * @see org.springframework.security.web.authentication.
 * SavedRequestAwareAuthenticationSuccessHandler
 * #onAuthenticationSuccess(javax.servlet.http.HttpServletRequest,
 * javax.servlet.http.HttpServletResponse,
 * org.springframework.security.core.Authentication)
 */
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws ServletException, IOException {

    String url = (String) request.getSession().getAttribute("url_prior_login");

    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    if (principal != null && principal instanceof RecipeUser) {
        request.getSession().setAttribute("RecipeUser", (RecipeUser) principal);
    }


    getRedirectStrategy().sendRedirect(request, response, url);
}

}

此类将在用户登录网站时将用户重定向到食谱列表页面或食谱详细信息页面。我将这个类注册在security-context.xml文件中:
<http use-expressions="true" auto-config="false"  entry-point-ref="authenticationEntryPoint">
            <intercept-url pattern="/login" access="permitAll" />
            <form-login login-page="/login" authentication-failure-url="/loginfail"
                    default-target-url="/login"
                    authentication-success-handler-ref="successHandler" />
            <logout logout-success-url="/" />
    </http>

    <authentication-manager alias="authManager">
            <authentication-provider user-service-ref='myUserDetailsService' />
    </authentication-manager>

    <beans:bean id="myUserDetailsService" class="com.safe.stack.service.security.UserService">
            <beans:property name="dataSource" ref="dataSource" />
    </beans:bean>

    <beans:bean id="successHandler"
            class="com.safe.stack.service.security.SuccessHandler" />


    <beans:bean id="authenticationEntryPoint"
            class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
            <beans:property name="loginFormUrl" value="/login"/>
    </beans:bean>

这是实现我想要实现的目标的好方法吗?有一个更好的方法吗 ?我找不到使用Spring MVC进行此操作的任何示例。

谢谢

最佳答案

这是我在 Spring 3.1.4中的操作方式

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

            // Supplies the default target Url that will be used if
            // no saved request is found in the session
            setDefaultTargetUrl("/member/dashboard");
            super.onAuthenticationSuccess(request, response, authentication);
    }

扩展SavedRequestAwareAuthenticationSuccessHandler是正确的,因为重定向是自动完成的。

08-03 20:04