Spring Security 登录失败后弹窗提示的一种方案
解决方案基于 Thymeleaf 页面,优点是通过检测 session 值的方式而不是 url 路径参数,避免了刷新页面时重复弹出警告的现象。
-
自定义登录失败处理器,向 session 写入 error 属性:
@Component public class CustomAuthenticationFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException { request.getSession().setAttribute("error", exception.getMessage()); response.sendRedirect("/login"); } } -
在 Spring Security 设置类使用这个处理器:
http.formLogin(f -> f.loginPage("/login").failureHandler(failureHandler).permitAll()); -
在你的登录控制器里写入检测 error 属性是否存在的逻辑:
@GetMapping("/login") public String login(Principal principal, Model model, HttpSession session) { if (principal != null) { return "redirect:/"; } Object errorMessage = session.getAttribute("error"); if (errorMessage != null) { model.addAttribute("error", errorMessage.toString()); session.removeAttribute("error"); } return "front/login"; } -
在 Thymeleaf 页面根据 error 属性是否存在展示弹窗:
<!-- 这里用了 SweetAlert2 --> <script th:if="${error}" type="text/javascript"> Swal.fire({ icon: 'error', title: '登录失败', text: '用户名或密码错误!' }); </script>
7636

被折叠的 条评论
为什么被折叠?



