我有一个thymeleaf注册表单,如果我们提交该表单,则将调用“ / signup_do”中的控制器,该控制器将用户验证并保存到数据库中:
<form action="/signup_do" method="post">
...
</form>
位于“ / signup_do”的控制器将请求传递给accountRegistration服务方法,该方法执行验证:
@PostMapping("/signup_do")
public String register(Account account, HttpSession session) {
session.setAttribute("accountToRegister", account);
accountManagement.accountRegistration(account);
return "Success";
}
帐户注册方法可以引发异常SignupFormException,该异常由该控制器类中定义的@ExceptionHandler处理:
@ExceptionHandler(value=SignupFormException.class)
public String handle(HttpSession session, Model response) {
Account returnDataToForm = (Account) session.getAttribute("accountToRegister");
response.addAttribute("name", returnDataToForm.getFirstName());
session.invalidate();
return "signup";
}
现在问题是,当发生异常时,在表单中输入的输入将传递回注册表单,并且输入的数据保持不变,但是 URL仍保持为/ signup_do 。
我尝试使用return“ redirect:/ signup”代替,它确实更改了网址,但最终还是向/ signup网址发出了get请求,例如
/signup?name=John...
但是我的/ signup控制器不是为处理get请求而设计的,它只是知道显示表单,因此信息丢失了。
@GetMapping("/signup")
public String signupPage() {return "signup";}
我也尝试过使用forward:/ signup,但是最终抛出405错误。
答案 0 :(得分:1)
问了几个小时后,我想出了一个干净的解决方法。
我所做的就是将处理注册过程的控制器的名称也更改为(“ / signup”)。因为显示页面的控制器是@GetMapping(“ / signup”),而处理注册过程的控制器是@PostMapping(“ / signup”),所以不会发生冲突。
现在,即使控制器发生更改,URL也保持不变,因为它们都是注册用户。
@GetMapping("/signup")
public String signupPage() {return "signup";}
@PostMapping("/signup")
public String register(Account account, HttpSession session) {
session.setAttribute("accountToRegister", account);
accountManagement.accountRegistration(account);
return "success";
}
这就像我想要的那样工作!
答案 1 :(得分:0)
重定向将向控制器发出一个get请求,以寻找要显示的视图,这在您的情况下意味着由于您给出的原因而丢失了数据。我可以想到两种解决方法: