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()