如果引发异常,则将网址改回原始网址,然后返回表格

时间:2019-07-15 17:52:16

标签: spring-boot thymeleaf

我有一个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错误。

2 个答案:

答案 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请求,以寻找要显示的视图,这在您的情况下意味着由于您给出的原因而丢失了数据。我可以想到两种解决方法:

  1. 请勿在每次进入此视图时执行重定向,并使用javascript手动更改URL。如果您不喜欢视图中的URL错误,则手动编辑看起来是最合理,最直接的方法。您可以查看here的操作方法,并将其包含在每次页面加载/按下提交按钮时都会执行的脚本中。

  2. 执行重定向并避免丢失信息,方法是将其存储在会话中一段时间​​,然后以this的方式在百里香叶中访问它,而不是从model属性中获取它。这意味着您稍后必须小心删除此会话属性。您对表单视图的获取请求包含用户信息也不是很“干净”,因此,如果可以避免的话,我不会采用这种解决方案。