当用户使用 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 标头是否有 &lt;html xmlns:th="http://www.thymeleaf.org"&gt; 并确保 Thymleaf 在您的类路径中! 即使用户处于非活动状态,这总是显示用户名和密码无效。

以上是关于当用户使用 Spring Boot 登录失败时,如何在登录页面中显示错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 无法登录

Spring Security 多个登录用户失败

Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息

使用Spring Boot Starter安全性中的Custom登录页面成功登录,没有进入下一页

Spring Boot 构建可执行 jar 失败

当 Spring Boot 中使用 Hibernate Validator 的 Bean 验证失败时,如何抛出自定义异常?