Spring Boot成功登录后重定向到当前页面

17

我在模态窗口中有登录表单。成功登录后,用户将被重定向到/页面。我正在尝试找到一种方法,在登录后停留在联系页面或另一个页面。如何做到这一点?我的代码是:

我有模态窗口中的登录表单。成功登录后,用户将被重定向到/页面。我正在尝试找到一种方法,在登录后停留在联系页面或其他页面。如何实现此目标?我的代码如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/css/**","/js/**","/fonts/**","/images/**","/home","/","/kontakt").permitAll()
            .antMatchers("/userlist").hasRole("ADMIN")
            .anyRequest().authenticated();
    http
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .logoutSuccessUrl("/");
}
8个回答

22
你可以使用自定义的AuthenticationSuccessHandler并将useReferer设置为true
@Bean
public AuthenticationSuccessHandler successHandler() {
    SimpleUrlAuthenticationSuccessHandler handler = new SimpleUrlAuthenticationSuccessHandler();
    handler.setUseReferer(true);
    return handler;
}

在您的configure方法中:

http
    .formLogin()
        .loginPage("/login")
        .successHandler(successHandler())
        .permitAll()
        .and()

9

只是提供一个替代方案:

formLogin()
    .loginPage("/login")
    .defaultSuccessUrl("/")

defaultSuccessUrl 是添加自定义 SuccessHandler 的快捷方式。


2
你的答案与当前问题的版本不匹配。而且你的答案有缺陷,defaultSuccessUrlSavedRequestAwareAuthenticationSuccessHandler的快捷方式,而不是自定义SuccessHandler - dur

8

我遇到了一个奇怪的问题,登录时会把用户重定向到localhost:8080/js/bootstrap.min.js

如果其他人也遇到了登录后奇怪的重定向问题,似乎覆盖了.defaultSuccessUrl(),那么请尝试在SecurityConfig中添加以下代码:

@Override
public void configure(WebSecurity security){
    security.ignoring().antMatchers("/css/**","/images/**","/js/**");
}

将您的所有 Resources/static 文件夹添加到 antMatchers() 中。

我不知道为什么你被低估了。你的答案帮助我解决了完全相同的问题。 - OmriYaHoo
也对我有用(我遇到了一个奇怪的重定向到logo.png) - oschlueter
在找到你的解决方案之前,我调试了数小时并尝试了多种解决方案!谢谢。 - GENE
我也遇到过这种情况。谢谢! - undefined

5
您可以在您的AuthenticationSuccessHandler实现中执行此操作:
@Override
public void onAuthenticationSuccess(HttpServletRequest request, 
HttpServletResponse response, Authentication authentication) throws 
IOException, ServletException 
{
    //Do your logic;
    response.sendRedirect(request.getHeader("referer");
}

4
配置与被接受的答案相同,唯一我所拥有的运气就是成功扩展SavedRequestAwareAuthenticationSuccessHandler
public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                                        Authentication authentication) throws IOException, ServletException {
        System.out.println("HEP HEP");
        super.onAuthenticationSuccess(request, response, authentication);
    }
}

1
这是我唯一可行的解决方案,非常感谢。关键在于使用“SavedRequestAwareAuthenticationSuccessHandler”。 - meniluca

2
我在将Bootstrap添加到项目树中后也遇到了不适当的重定向问题。
使用标志为真的方法.defaultSuccessUrl使我节省了时间和代码行数。
.formLogin()
   .loginPage("/login")
   .defaultSuccessUrl("/", true)
   .permitAll()

很难相信这是如此简单!谢谢你这样使用.defaultSuccessUrl("/goToThisUrlAfterLogin", true)让我的一天变得美好! - Piotr Żak
你节省了我好几个小时的烦恼。非常感谢! - fire_water

0

Spring路由,即扩展SavedRequestAwareAuthenticationSuccessHandlerSimpleUrlAuthenticationSuccessHandler可能有点笨重。在控制器(例如处理登录的控制器)中,您可以自己执行标题请求;例如:

HttpServletRequest request = null;

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

您会注意到,在手动注销(由用户启动)或会话超时(由Spring会话处理)之前,您将获得URL:您将获得https://iAmPriorUrl.com/...。然后,您可以随心所欲地使用它。


-1

@Jonas你所需要做的就是在结尾加上.requestCache()

你的配置将会像这样

         .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .permitAll()
            .and()
            .requestCache()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接