Spring Загрузите перенаправление на текущую страницу после успешного входа в систему

У меня есть формы входа в модальные окна. После успешного входа пользователя пользователь перенаправляется на страницу /. Я пытаюсь найти способ оставаться на странице контакта или другой странице после входа в систему. Как это сделать? Мой код:

@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("/");
}

Ответ 1

Вы можете использовать пользовательский 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()

Ответ 2

Просто чтобы предоставить альтернативное решение:

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

defaultSuccessUrl является ярлыком для добавления пользовательского SuccessHandler.

Ответ 3

Вы также можете сделать это в своей реализации AuthenticationSuccessHandler:

@Override
public void onAuthenticationSuccess(HttpServletRequest request, 
HttpServletResponse response, Authentication authentication) throws 
IOException, ServletException 
{
    //Do your logic;
    response.sendRedirect(request.getHeader("referer");
}

Ответ 4

У меня была странная проблема, которая заставила бы логин перенаправлять пользователя на localhost:8080/js/bootstrap.min.js

Если кто-то еще сталкивается с нечетным перенаправлением при входе в систему, который, кажется, переопределяет .defaultSuccessUrl(), попробуйте добавить этот код ниже в SecurityConfig:

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

Добавьте все ваши папки Resources/static в antMatchers()

Ответ 5

Путь Spring, а именно расширение SavedRequestAwareAuthenticationSuccessHandler или SimpleUrlAuthenticationSuccessHandler может быть немного неуклюжим для реализации. В контроллере (например, тот, который обрабатывает логины) вы можете сделать запрос заголовка самостоятельно; например:

HttpServletRequest request =null;

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

Вы заметите, что у вас будет URL до либо ручного (инициируемого пользователем) выхода из системы, либо времени ожидания сеанса (как обрабатывается сеансом Spring): вы получите https://iAmPriorUrl.com/... Тогда вы можете делать с ней все, что захотите.

Ответ 6

@Jonas Все, что вам нужно сделать, это добавить .requestCache() в конец

вы будете выглядеть так:

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