出现的问题
昨天,在初次使用 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";
}
}
看来是我想太多,想当然。
请勿发布违反中国大陆地区法律的言论,请勿人身攻击、谩骂、侮辱和煽动式的语言。