当用户使用 Spring Boot 登录失败时,如何在登录页面中显示错误消息?
Posted
技术标签:
【中文标题】当用户使用 Spring Boot 登录失败时,如何在登录页面中显示错误消息?【英文标题】:How to show error message in login page when user fail to login with Spring Boot? 【发布时间】:2018-10-30 03:19:42 【问题描述】:现在我正在使用 Spring Boot 做项目。我想在登录失败时显示错误消息。当我做 Maven 项目时,我很容易用 BindingResult 做到了。我按照几个指示完成了我想做的任务。但我无法得到任何适当的解决方案。我需要一个最简单的解决方案。
这是我的Controller
课程
@RequestMapping(value = "/loginCheck", method = RequestMethod.POST)
public String checkLogin(@RequestParam String roll, @RequestParam String pass)
if (studentService.existsByRollAndPass(roll, pass))
return "Welcome";
else
return "Login";
而我的html
文件是
<form class="form-horizontal" method="post" action="/loginCheck">
<fieldset>
<div class="form-group">
<label class="col-md-4 control-label" for="textinput">Roll</label>
<div class="col-md-4">
<input id="textInput" name="roll" type="text"
placeholder="Roll" class="form-control input-md">
</div>
</div>
<!-- Password input-->
<div class="form-group">
<label class="col-md-4 control-label" for="password">Password</label>
<div class="col-md-4">
<input id="password" name="pass" type="password"
placeholder="password" class="form-control input-md">
</div>
</div>
<!-- Button -->
<div class="form-group">
<label class="col-md-4 control-label" for="login"></label>
<div class="col-md-4">
<button id="login" name="login" class="btn btn-primary">Login</button>
</div>
</div>
</fieldset>
</form>
【问题讨论】:
【参考方案1】:您也可以通过实现 AuthenticationFailureHandler 并使用参数重定向来指示出现登录错误。
在您扩展 WebSecurityConfigurerAdapter 的类中,在 configure 方法的覆盖中,确保添加您的 failureHandler
@Override
protected void configure(HttpSecurity http) throws Exception
...
.failureHandler(getAuthenticationFailureHandler())
...
@Bean
public AuthenticationFailureHandler getAuthenticationFailureHandler()
return new MyAuthenticationFailureHandler();
并且在你实现了AuthenticationFailureHandler的类中(例如:MyAuthenticationFailureHandler),实现onAuthenticationFailure方法并重定向到登录页面,并在URL中添加一个参数,例如loginError=true。
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler
@Override
public void onAuthenticationFailure(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
AuthenticationException e) throws IOException, ServletException
httpServletResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
httpServletResponse.sendRedirect("/login?loginError=true");
然后在你的 login.html 页面中,使用 $param.loginError 来检查这个 URL 参数。
<p class="text-danger" th:if="$param.loginError" th:text="'Wrong username or password'"></p>
【讨论】:
【参考方案2】:浪费了 3 个小时后,我解决了这个问题。我改变了我的html
标题
<html xmlns:th="http://www.w3.org/1999/xhtml" lang="en">
到
<html xmlns:th="http://www.w3.org/1999/xhtml" xmlns:sf="http://www.w3.org/1999/xhtml" lang="en">
并在Controller
类中添加了Model
。现在我的控制器类是
@RequestMapping(value = "/loginCheck", method = RequestMethod.POST)
public String checkLogin(@RequestParam String roll, @RequestParam String pass, Model model)
if (studentService.existsByRollAndPass(roll, pass))
return "Welcome";
else
model.addAttribute("logError","logError");
return "Login";
为了捕捉错误,我在html
文件中添加了一行代码。
<span th:if="$logError != null" class="error">Wrong user or password</span>
现在一切正常!!!
【讨论】:
是的,但您尝试过 thymeleaf.org">。你使用 JSP 还是 Thymeleaf? th 标签用于 Thymeleaf。 是的,在模型中添加属性比我的更好。 谢谢@funky-nd :) !【参考方案3】:您可以在 URL 中添加错误参数,例如 localhost:8080/login?error。然后,在 Thymeleaf 的帮助下,你可以将这个 div 添加到 html 中。
<div th:if="$param.error" class="alert alert-danger">
Invalid username and password.
</div>
如果URL有错误参数,就会显示这个div。
但是,您可能需要更改
return "Login"
到
return "redirect:Login?error";
【讨论】:
我试过了!但是 $param.error 这个给出错误。 “无法解析 'param' less ... (Ctrl+F1) 验证未解析的引用和无效的表达式”。 它可以工作 @Avijit Barua 请检查您的 Thymleaf 标头是否有<html xmlns:th="http://www.thymeleaf.org">
并确保 Thymleaf 在您的类路径中!
即使用户处于非活动状态,这总是显示用户名和密码无效。以上是关于当用户使用 Spring Boot 登录失败时,如何在登录页面中显示错误消息?的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息
使用Spring Boot Starter安全性中的Custom登录页面成功登录,没有进入下一页
当 Spring Boot 中使用 Hibernate Validator 的 Bean 验证失败时,如何抛出自定义异常?