3

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

我在 Controller 类中编写了这个方法。每当用户登录网站时都会调用此方法。我将引用 URL 存储到会话中。将此 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 的示例。

谢谢

4

2 回答 2

1

这就是我在 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是正确的,因为重定向是自动完成的。

于 2013-12-10T17:17:19.893 回答
0

只需将新属性“ always-use-default-target ”添加到“form-login”标签并将其设置为“ false ”(默认情况下它设置为“true”,即使不指定它),如下所示:

<form-login 
  login-page="/login" authentication-failure-url="/loginfail"
  default-target-url="/login"
  authentication-success-handler-ref="successHandler" 
  always-use-default-target="false"
/>

您可以在此处的 Spring Security 文档中阅读有关它的更多信息,在第 3.2.3 节的末尾。

如果您添加它,您将不再需要自定义 onAuthenticationSuccess 并且您不需要在登录页面的会话中存储任何内容。

于 2012-12-30T16:59:45.560 回答