0

我想根据 login.jsp 页面中的一些隐藏值重定向我的页面,这是我的代码

public class AuthenticationHandler extends SavedRequestAwareAuthenticationSuccessHandler {

    private final String HASH_URL = "hashURL";

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
        super.onAuthenticationSuccess(request, response, authentication);

        String hashValue = request.getParameter(HASH_URL);
        if(hashValue != null){
            if(!hashValue.isEmpty()){
                setDefaultTargetUrl("/home/" + hashValue);
            }
        }
    }
}

我可以看到 hashValue 正在从 login.jsp 页面获取最新值,但它总是在移动站点 /home/ 页面,这是我的配置

<security:form-login
                login-page="/auth/login"
                default-target-url="/home/"
                authentication-success-handler-ref="customAuthenticationSuccessHandler"
                always-use-default-target="true"
                authentication-failure-url="/auth/login?error=true"/>
4

2 回答 2

1

您不应该setDefaultTargetUrl在应用程序运行时调用。它是类中的一个字段,而不是局部变量,因此它将适用于您站点的所有用户。

看看你正在扩展的代码SavedRequestAwareAuthenticationSuccessHandler。如果要调用超类方法,了解它的工作原理至关重要。您调用super.onAuthenticationSuccess方法中的第一件事。这将采用defaultTargetUrl(或缓存的请求)的当前值并重定向到该 URL。您在重定向发生后设置属性。

正如我所说,您根本不应该在运行时设置该属性。我猜你的方法应该更像

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

    String hashValue = request.getParameter(HASH_URL);
    if(hashValue != null) {
        response.sendRedirect(getDefaultTargetUrl() + "/" + hashValue;
    } else {
        response.sendRedirect(getDefaultTargetUrl());
    }
}

你可能根本不需要扩展一个类。AuthenticationSuccessHandler直接自己实现即可。如果不涉及继承,将更容易理解发生了什么。

并不是说如果您使用自定义处理程序类,always-use-default-target影响默认处理程序的命名空间属性不会有任何影响。

于 2013-07-12T11:13:27.763 回答
1

我已经在您之前的问题中引用了这一点,用户注销到上一页打开后重定向 URL

在成功验证 SavedRequestAwareAuthenticationSuccessHandler 之后:
如果 alwaysUseDefaultTargetUrl 属性设置为 true,则 defaultTargetUrl
将用于目的地。
存储在会话中的任何 DefaultSavedRequest 都将被删除。

所以你应该设置 always-use-default-target="false" 你也可以删除 default-target-url 属性。

希望这可以帮助。

于 2013-07-12T11:48:40.900 回答