出现的问题

昨天,在初次使用 Thymeleaf 这个模版引擎,做登录的时候。如果登录成功,就不会有下面这个错误,如果是登录失败或者啥都没输入都会报错。

控制台给出的警告信息。

2021-07-08 19:02:27.692  WARN 13800 --- [p-nio-80-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]

点击登录的时候,发送请求时爆出了一堆信息,错误码为 405 。

刚开始自以为是的认为是 Thymeleaf 的问题,甚至还天真的认为是 SpringBoot 整合的 web 模块有 bug ,认为这个 bug 是没有处理 POST 请求。后面发现其实都不是,是我的问题😂😂。

造成的原因

登录处理的逻辑如下:

用户在提交表单信息之后,就通过这个方法来对请求进行处理。处理的逻辑很简单,如果用户名和密码都对啦,则进入主页,否则就请求转发到登录页面。

@PostMapping("/login_do")
public String loginDo(User user, HttpSession session, Model model) {
    if("xiaohehe".equals(user.getUsername()) && "123456".equals(user.getPassword())) {
        session.setAttribute("user", user);
        return "redirect:/index.html";
    } else {
        model.addAttribute("msg", "用户名或密码不对");
        return "forward:/login";
    }
}

登录界面的请求如下。

@GetMapping({"/login", "/"})
public String login() {
    return "login";
}

我犯了一个非常低级的错误。就是请求转发时,请求的类型没有对应上。登录验证的时候发现登录操作用的是 POST 请求,而我转发的目标请求是只接收 GET 请求,结果导致请求类型不一致,导致了 405 错误。这才是最根本的原因。

解决的办法

使用重定向是一种办法。重定向就是发送了一个新的请求,原来的请求结束了。虽然不报错,但是这样确没有提示我说“用户名或密码不对”。所以登录失败之后,就直接将这个页面返回给浏览器端就好了。

正确的写法是这样的

@PostMapping("/login_do")
public String loginDo(User user, HttpSession session, Model model) {
    if("xiaohehe".equals(user.getUsername()) && "123456".equals(user.getPassword())) {
        session.setAttribute("user", user);
        return "redirect:/index.html";
    } else {
        model.addAttribute("msg", "用户名或密码不对");
        return "login";
    }
}

看来是我想太多,想当然。