重复提交表单

Aternjon 2013-12-27 09:41:21
什么是重复提交
所谓重复提交,就是用户在页面多次点击提交按钮,或者通过不断刷新页面,把已经提交过的数据多次向后台提交。
重复提交对于查询类的功能,问题还不是太大,但是对于新增或是修改类的功能,就有可能凭空的出现很多同样信息的重复数据,从而导致业务功能出现错误。
用一个实例来让大家体会一下重复提交的问题,来实现一个订单新增的功能,订单号一般都是由后台自动生成,前台页面只要传递订购人、订购商品和订购数量等订单的具体信息过来就可以了。为了示例的简洁,只是从前台传递一个订购的商品和一个订购的数量,一共两个值就可以了,就不去处理什么订单的主记录、子记录等复杂的功能了。
1:实现Action
写一个处理订单的Action,接收前台传递过来的数据,然后输出即可。为了表示会花一定的时间来进行业务处理,在execute方法里面,让线程休息6秒,示例代码如下:

java代码:
查看复制到剪贴板打印
public class TokenAction extends ActionSupport{
private String productId;
private int orderNum;

public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public int getOrderNum() {
return orderNum;
}
public void setOrderNum(int orderNum) {
this.orderNum = orderNum;
}
public String execute() throws Exception {
System.out.println("预定的产品编号是:"+this.productId+",预定数量为:"+this.orderNum);
Thread.sleep(6000L);
System.out.println("处理完成!");
return SUCCESS;
}
}
2:配置Action
在struts.xml中配置Action,示例如下:

java代码:
查看复制到剪贴板打印
<package name="helloworld" extends="struts-default">
<action name="tokenAction" class="cn.javass.token.TokenAction">
<result>/token/list.jsp</result>
</action>
</package>

java代码:
查看复制到剪贴板打印
3:制作新增页面
提供新增页面来让用户输入:预定的产品编号和预定的数量,然后提交到上面的Action,示例代码如下:

java代码:
查看复制到剪贴板打印
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Insert title here</title>
</head>
<body>
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:form action="/tokenAction.action" method="post">
<s:textfield name="productId" label="预定的产品编号"/>
<s:textfield name="orderNum" label="预定的数量"/>
<s:submit value="提交"/>
</s:form>
</body>
</html>
4:运行测试
运行新增页面,填写数据,然后点击提交。由于Action中,让当前线程sleep了6秒钟,所以必须等6秒之后才能正确的结束调用。
如果这个时候用户乖乖的等足6秒,自然没有什么问题。但是,如果用户在第一次提交还没有响应的时候,又再次点击了提交按钮,则同样的请求再次被提交,这时候,如果不加任何控制的话,同样的订单就将被处理两次了。
可以在控制台中看到输出以下信息:

java代码:
查看复制到剪贴板打印
预定的产品编号是:1,预定数量为:2
预定的产品编号是:1,预定数量为:2
处理完成!
处理完成!
很明显数据重复了,这种重复提交的问题,会给业务处理带来很多的麻烦,应该在开发中杜绝这个问题。
...全文
358 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuyeyi 2014-01-02
  • 打赏
  • 举报
回复
学12306 按钮灰几秒,或者异步提交成功后,按钮恢复
perfect_means_shit 2013-12-28
  • 打赏
  • 举报
回复
令牌方式比较可取。。
宁波朱超 2013-12-28
  • 打赏
  • 举报
回复
引用 楼主 u013062625 的回复:
什么是重复提交 所谓重复提交,就是用户在页面多次点击提交按钮,或者通过不断刷新页面,把已经提交过的数据多次向后台提交。 重复提交对于查询类的功能,问题还不是太大,但是对于新增或是修改类的功能,就有可能凭空的出现很多同样信息的重复数据,从而导致业务功能出现错误。 用一个实例来让大家体会一下重复提交的问题,来实现一个订单新增的功能,订单号一般都是由后台自动生成,前台页面只要传递订购人、订购商品和订购数量等订单的具体信息过来就可以了。为了示例的简洁,只是从前台传递一个订购的商品和一个订购的数量,一共两个值就可以了,就不去处理什么订单的主记录、子记录等复杂的功能了。 1:实现Action 写一个处理订单的Action,接收前台传递过来的数据,然后输出即可。为了表示会花一定的时间来进行业务处理,在execute方法里面,让线程休息6秒,示例代码如下: java代码: 查看复制到剪贴板打印 public class TokenAction extends ActionSupport{ private String productId; private int orderNum; public String getProductId() { return productId; } public void setProductId(String productId) { this.productId = productId; } public int getOrderNum() { return orderNum; } public void setOrderNum(int orderNum) { this.orderNum = orderNum; } public String execute() throws Exception { System.out.println("预定的产品编号是:"+this.productId+",预定数量为:"+this.orderNum); Thread.sleep(6000L); System.out.println("处理完成!"); return SUCCESS; } } 2:配置Action 在struts.xml中配置Action,示例如下: java代码: 查看复制到剪贴板打印 <package name="helloworld" extends="struts-default"> <action name="tokenAction" class="cn.javass.token.TokenAction"> <result>/token/list.jsp</result> </action> </package> java代码: 查看复制到剪贴板打印 3:制作新增页面 提供新增页面来让用户输入:预定的产品编号和预定的数量,然后提交到上面的Action,示例代码如下: java代码: 查看复制到剪贴板打印 <%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>Insert title here</title> </head> <body> <%@ taglib prefix="s" uri="/struts-tags"%> <s:form action="/tokenAction.action" method="post"> <s:textfield name="productId" label="预定的产品编号"/> <s:textfield name="orderNum" label="预定的数量"/> <s:submit value="提交"/> </s:form> </body> </html> 4:运行测试 运行新增页面,填写数据,然后点击提交。由于Action中,让当前线程sleep了6秒钟,所以必须等6秒之后才能正确的结束调用。 如果这个时候用户乖乖的等足6秒,自然没有什么问题。但是,如果用户在第一次提交还没有响应的时候,又再次点击了提交按钮,则同样的请求再次被提交,这时候,如果不加任何控制的话,同样的订单就将被处理两次了。 可以在控制台中看到输出以下信息: java代码: 查看复制到剪贴板打印 预定的产品编号是:1,预定数量为:2 预定的产品编号是:1,预定数量为:2 处理完成! 处理完成! 很明显数据重复了,这种重复提交的问题,会给业务处理带来很多的麻烦,应该在开发中杜绝这个问题。
我的做法是通过AJAX异步提交的方式(用户体验好) 提交的时候一个全屏的DIV进行遮蔽 操作成功之后进行页面跳转。 让用户乖乖等。。。我想用户下一次就不会来了。
kevin-go 2013-12-28
  • 打赏
  • 举报
回复
不是Strust2的拦截器就可以的处理重复提交的吗
teemai 2013-12-28
  • 打赏
  • 举报
回复
姜小白- 2013-12-27
  • 打赏
  • 举报
回复
之前遇到过重复提交的事情,主要是后台响应比较慢。 页面上把按钮的click事件绑定上去,点击按钮后,移除click事件,页面上将不再重复提交事件。
tony4geek 2013-12-27
  • 打赏
  • 举报
回复
私塾在线网站原创《研磨struts2》系列 广告?
姜小白- 2013-12-27
  • 打赏
  • 举报
回复
异常异长 2013-12-27
  • 打赏
  • 举报
回复
也可以锁表来完成吧。。个人观点
leox_2010 2013-12-27
  • 打赏
  • 举报
回复
采用令牌方式 <s:token /> <s:form action="/tokenAction.action" method="post"> <s:token></s:token> <s:textfield name="productId" label="预定的产品编号"/> <s:textfield name="orderNum" label="预定的数量"/> <s:submit value="提交"/> </s:form> 你上网搜一下这个标签,这是struts2的一个标签

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧