Мне удалось выяснить это.
@Configuration
@EnableWebSecurity
class SecurityConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.formLogin()
.loginPage("/entry")
.loginProcessingUrl("/auth")
.usernameParameter("usr")
.passwordParameter("pwd")
.defaultSuccessUrl("/", true)
.failureHandler { request, response, _ ->
request.session.setAttribute("loginError", "Login Error!")
request.session.setAttribute("failedUsername", request.getParameter("usr"))
response.sendRedirect("/entry")
}
}
}
Затем вам нужно настроить контроллер входа в систему для настройки обслуживания формы входа в систему:
@Controller
@RequestMapping("/entry")
internal class LoginController {
@GetMapping
fun getLoginForm(session: HttpSession, model: Model): String {
if (session.getAttribute("loginError") != null) {
model.addAttribute("loginError", "Login Error!")
session.removeAttribute("loginError")
model.addAttribute("failedUsername", session.getAttribute("failedUsername"))
session.removeAttribute("failedUsername")
}
return "login"
}
}
Затем вы можете использоватьloginError
и failedUsername
атрибуты модели в ваших шаблонах:
<div th:if="${loginError}">Incorrect login/password</div>
<!-- ... -->
<input type="text" name="usr" th:value="${failedUsername}">
По сути, мы эмулируем "мигание" сообщений в сеанс.Мы несем эти сообщения в сеансе и удаляем их, как только они прочитаны и переданы в модель.Возможно, что перенаправление пойдет не так, и сообщения останутся в сеансе, но они безвредны сами по себе, плюс они будут удалены при следующем посещении страницы /entry
.
В результате теперь существуетв URL-адресе страницы отсутствует ?error
, и пользователю не требуется повторно вводить имя пользователя.