刷新页面时避免Spring MVC表单重复提交

4

我正在使用Spring MVC将数据保存到数据库中。问题是当我刷新页面时,它会重新提交JSP页面。 以下是我的代码片段:

<c:url var="addNumbers" value="/addNumbers" ></c:url>
<form:form action="${addNumbers}" commandName="AddNumber" id="form1">

</<form:form>

@RequestMapping(value = "/addNumbers",  method = RequestMethod.POST)
public String addCategory(@ModelAttribute("addnum") AddNumber num){
    this.numSrevice.AddNumbers(num);
    return "number";
}
3个回答

10

您需要实现Post/Redirect/Get

当POST方法完成后,不要返回视图名称,而是使用"redirect:<pageurl>"发送重定向请求。

@RequestMapping(value = "/addNumbers",  method = RequestMethod.POST)
public String addCategory(@ModelAttribute("addnum") AddNumber num){
    this.numSrevice.AddNumbers(num);
    return "redirect:/number";
}

有一个方法,其method = RequestMethod.GET,并返回视图名称。

@RequestMapping(value = "/number",  method = RequestMethod.GET)
public String category(){
    return "number";
}

因此,post方法将向浏览器返回重定向响应,然后浏览器将使用get方法获取重定向URL,以避免重新提交。

注意:我假设您在控制器级别上没有任何@RequestMapping。如果有,请在redirect:/numbers之前添加该映射。


2

我的答案展示了如何做到这一点,包括验证错误信息。

另一个选项是使用Spring Web Flow,它可以自动为您完成此操作。


2
您可以从处理程序方法返回一个使用URL初始化的RedirectView:
@RequestMapping(value = "/addNumbers",  method = RequestMethod.POST)
public View addCategory(@ModelAttribute("addnum") AddNumber num,
                        HttpServletRequest request){
    this.numSrevice.AddNumbers(num);
    String contextPath = request.getContextPath();
    return new RedirectView(contextPath + "/number");
}

谢谢@Evil Toad!我想在POST后从调用/addNumber的同一视图上重定向。 - neeraj simon
只需更改 RedirectView 构造函数的参数中的 URL 即可。 - Evil Toad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接