Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 成功登录后,Spring security偶尔会重定向到默认页面,而不是预登录页面_Java_Spring_Spring Boot_Spring Security - Fatal编程技术网

Java 成功登录后,Spring security偶尔会重定向到默认页面,而不是预登录页面

Java 成功登录后,Spring security偶尔会重定向到默认页面,而不是预登录页面,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我们的团队正在使用SpringBoot(2.2.2)开发一个web应用程序。它使用Spring安全性来处理登录过程。我们希望应用程序在登录前重定向回页面(例如,用户访问->如果登录会话已过期,则显示登录页面->如果登录成功,则返回到) 除了应用程序偶尔指向默认页面(例如,)而不是登录前的页面之外,一切似乎都很好。发生这种情况时,登录前的页面似乎没有保存在会话中(根据我的队友的报告)。这是因为我们的配置问题吗 以下是我们的网站安全配置 @Override public void confi

我们的团队正在使用SpringBoot(2.2.2)开发一个web应用程序。它使用Spring安全性来处理登录过程。我们希望应用程序在登录前重定向回页面(例如,用户访问->如果登录会话已过期,则显示登录页面->如果登录成功,则返回到)

除了应用程序偶尔指向默认页面(例如,)而不是登录前的页面之外,一切似乎都很好。发生这种情况时,登录前的页面似乎没有保存在会话中(根据我的队友的报告)。这是因为我们的配置问题吗

以下是我们的网站安全配置

@Override
    public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("...")
            .anyRequest().authenticated()
        .and()
        .csrf().ignoringAntMatchers("...")
        .and()
        .formLogin()
            .loginPage("/loginForm")
            .loginProcessingUrl("/login")
            .usernameParameter("userId")
            .passwordParameter("password")
            .failureUrl("/loginForm?error=true")
            .permitAll()
        .and()
        .logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .logoutSuccessHandler(logoutSuccessHandler())
            .deleteCookies("JSESSIONID")
            .invalidateHttpSession(true)
            .permitAll()
        .and()
        .exceptionHandling()
            .accessDeniedHandler(new CustomAccessDeniedHandler())
        .and()
        .sessionManagement()
            .invalidSessionUrl("/loginForm")
            ;
    }
由于未在WebSecurityConfig中设置successHandler,因此默认情况下将调用SavedRequestAwareAuthenticationSuccessHandler。问题似乎出现在AuthenticationSuccess方法的以下部分中:

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

    if (savedRequest == null) {
        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);
}


有时savedRequest为null,因此Spring安全性会在成功登录后指向默认页面()。原因是什么?

重定向到上下文根目录是由于
sessionManagement().invalidSessionUrl(“/loginForm”)
引起的

这是因为您正在对登录页面进行显式调用,因此它被视为请求的页面,而不是用于身份验证的重定向。在进行身份验证之后,spring将重定向到默认url(默认情况下是上下文根,除非在配置中被重写)

在我看来,这种情况应该经常发生,而不是偶尔发生


请删除上述配置,并让spring处理身份验证的重新定向。:)

重定向到上下文根目录是由于
sessionManagement().invalidSessionUrl(“/loginForm”)
引起的

这是因为您正在对登录页面进行显式调用,因此它被视为请求的页面,而不是用于身份验证的重定向。在进行身份验证之后,spring将重定向到默认url(默认情况下是上下文根,除非在配置中被重写)

在我看来,这种情况应该经常发生,而不是偶尔发生


请删除上述配置,并让spring处理身份验证的重新定向。:)

您是否为登录提供了任何成功处理程序?使用
SavedRequestAwareAuthenticationSuccessHandler
可能有助于实现您的目标:@Dvalshevale由于未在WebSecurity配置中设置successHandler(),因此将调用默认的SavedRequestAwareAuthenticationSuccessHandler,不是吗?我已经编辑了我的问题,非常感谢任何进一步的建议:)如果未指定成功处理程序,则默认情况下将调用我的坏,
SavedRequestAwareAuthenticationSuccessHandler
。偶尔的重定向是由于
sessionManagement().invalidSessionUrl(“/loginForm”)
引起的。这是因为您正在对登录页面进行显式调用,而不是让spring处理重新身份验证。在我看来,这种情况应该经常发生,而不是偶尔发生。@DhavalShewale谢谢你的建议!:D我注释掉了
sessionManagement().invalidSessionUrl(“/loginForm”)
部分,它似乎按预期运行(总是在登录前直接返回页面)。很好:)将发布它作为结束问题的答案:)您是否提供了登录成功处理程序?使用
SavedRequestAwareAuthenticationSuccessHandler
可能有助于实现您的目标:@Dvalshevale由于未在WebSecurity配置中设置successHandler(),因此将调用默认的SavedRequestAwareAuthenticationSuccessHandler,不是吗?我已经编辑了我的问题,非常感谢任何进一步的建议:)如果未指定成功处理程序,则默认情况下将调用我的坏,
SavedRequestAwareAuthenticationSuccessHandler
。偶尔的重定向是由于
sessionManagement().invalidSessionUrl(“/loginForm”)
引起的。这是因为您正在对登录页面进行显式调用,而不是让spring处理重新身份验证。在我看来,这种情况应该经常发生,而不是偶尔发生。@DhavalShewale谢谢你的建议!:D我注释掉了
sessionManagement().invalidSessionUrl(“/loginForm”)
部分,它似乎按预期运行(总是在登录前直接返回页面)。太好了:)将发布它作为结束问题的答案:)