spring 当用户使用Sping Boot 登录失败时,如何在登录页面显示错误消息?

mctunoxg  于 2023-05-16  发布在  Spring
关注(0)|答案(3)|浏览(257)

现在我正在使用Sping 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>
amrnrhlw

amrnrhlw1#

您可以将错误参数放置到URL,如localhost:8080/login?错误。然后,在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";
qnakjoqk

qnakjoqk2#

我花了三个小时解决了这个问题。我更改了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>

现在一切正常!!!

bogh5gae

bogh5gae3#

您也可以通过实现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>

相关问题