У меня есть приложение Spring-boot, которое использует безопасность. Я хочу перенаправить на исходный запрошенный URL. Мне нужно было реализовать собственный SimpleUrlAuthenticationSuccessHandler, поэтому у меня есть этот код:
public class MySavedRequestAwareAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
public MySavedRequestAwareAuthenticationSuccessHandler() {
setUseReferer(true);
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
// do my stuff
logger.info(getTargetUrlParameter()); // this is = '/'
//logger.info(getDefaultTargetUrl()); // this is null
redirectStrategy.sendRedirect(request, response, "/");
}
}
Проблема в том, что после входа в систему никогда не происходит перенаправление на реферер. Мне пришлось добавить redirectStrategy.sendRedirect (запрос, ответ, "/"); часть.
В LoginController значение «Referer» в заголовке всегда равно нулю, если оно перенаправлено из весенней защиты. Если я добавлю URL «xxxx / login», значение будет установлено. Не очень полезно:
@RequestMapping(value = {"/login"}, method = RequestMethod.GET)
public ModelAndView login(HttpServletRequest request) {
String referer = request.getHeader("Referer");
modelAndView.addObject ("referer", referer); // this is NULL
//
modelAndView.setViewName("login");
return modelAndView;
}
Это моя конфигурация безопасности:
http.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/").authenticated()
.and()
.csrf().disable()
.formLogin()
.loginPage("/login")
.failureHandler(customAuthenticationFailureHandler)
.usernameParameter("email")
.passwordParameter("password")
.successHandler(authenticationSuccessHandler)
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logged-out")
.and()
.exceptionHandling()
.accessDeniedPage("/access-denied")