3

我在 login.jsp 页面的隐藏字段中设置了“cat=1”,并希望它可以在 default-target-url 上使用。spring-security.xml 中的条目是,

<form-login login-page="/login.html" default-target-url="/index.html"
            authentication-failure-url="/loginfailed.html" />

在控制器中,

@RequestMapping(value="/index", method = RequestMethod.GET)
    public String index(HttpServletRequest request) {
        String cat = request.getParameter("cat");
        if (cat != null && cat.equalsIgnoreCase("1")) {
            return "add";
        }  
        return "redirect:/index.jsp";
    }

但无法获取请求参数值(cat 为空),所以我认为这是因为“default-target-url”重定向了请求(并且不转发它?)。是这样吗?

如果是,那么有什么方法可以将参数传递给'default-target-url'?

4

3 回答 3

3

I have changed implementation approach a bit. Details give below,

spring-security.xml

<form-login login-page="/login.html" authentication-success-handler-ref="feedSuccessHandler"
            authentication-failure-url="/loginfailed.html" />
        <logout logout-success-url="/loggedout.html"/>

<beans:bean id="feedSuccessHandler"
     class="main.java.com.sp.utilities.FeedSuccessHandler">
    </beans:bean>

FeedSuccessHandler.java

public class FeedSuccessHandler implements AuthenticationSuccessHandler {

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

        String cat = request.getParameter("cat");
        if (cat != null && cat.equalsIgnoreCase("1")) {
            response.sendRedirect(request.getContextPath()+"/add.html");
        }else{
            SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
            if(savedRequest != null) {
                response.sendRedirect(savedRequest.getRedirectUrl());
            }else{
                response.sendRedirect(request.getContextPath()+"/");
            }
        }
    }
}

Application is working as desired also in future if I want to customize redirection based on roles, I can use same class.

于 2013-02-19T17:05:41.727 回答
1

它确实通过默认重定向,但是您可以使用几个配置选项来更改此行为。它们都定义在 AbstractAuthenticationTargetUrlRequestHandlerwhich 是两个现有身份验证成功处理程序实现的父类上(默认情况下SavedRequestAwareAuthenticationSuccessHandler由命名空间配置使用)。

  1. 设置它的targetUrlParameter属性,以便它检查 HTTP 请求是否具有具有该名称的参数。如果是这样,它将重定向到该请求参数中给出的 URL。

  2. 或者设置自定义redirectStrategy。默认实现调用response.sendRedirect(),但您可以在自定义实现中随意更改它。

但是您会遇到一些困难,因为这些配置点都不是通过命名空间配置公开的,因此您需要更深入地了解并手动编写 bean 定义。

于 2013-02-19T15:02:49.453 回答
0

重定向由 的redirectStrategy属性中定义的重定向策略控制SimpleUrlAuthenticationSuccessHandler

默认值redirectStrategy是 的一个实例DefaultRedirectStrategy

你需要做的是实现你自己的 redirectStrategy(implements RedirectStrategy)。然后配置它:

...
<bean id="usernamePasswordAuthenticationFilter">
    ...
    <property name="authenticationSuccessHandler">
        <bean
           class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
            <property name="redirectStrategy">
               <bean class="yourRedirectStrategy"/>
            <property>
         </bean>
    </property>
</bean>
于 2013-02-19T15:00:25.993 回答