STRUTS2 教程八维学院廉泽制作总目录?介绍与入门实例? Action ? Result ?标签?类型转换?校验框架?国际化?拦截器?上传下载?防止重复提交(令牌) ?常用配置本章目录?什么是重复提交?什么是令牌?令牌拦截器如何使用?简单实例?登录拦截器的使用什么是重复提交?所谓重复提交,就是用户在页面多次点击提交按钮,或者通过不断刷新页面,把已经提交过的数据多次向后台提交。?重复提交对于查询类的功能,问题还不是太大,但是对于新增或是修改类的功能,就有可能凭空的出现很多同样信息的重复数据,从而导致业务功能出现错误。?用一个实例来让大家体会一下重复提交的问题,来实现一个订单新增的功能,订单号一般都是由后台自动生成,前台页面只要传递订购人、订购商品和订购数量等订单的具体信息过来就可以了。为了示例的简洁,只是从前台传递一个订购的商品和一个订购的数量,一共两个值就可以了,就不去处理什么订单的主记录、子记录等复杂的功能了。模拟重复提交的产景?1:实现 Action ?写一个处理订单的 Action ,接收前台传递过来的数据, 然后输出即可。为了表示会花一定的时间来进行业务处理,在 execute 方法里面,让线程休息 6秒。 public class Order Action extends ActionSupport{ private String productId; private int orderNum; public String execute() throws Exception { (" 预定的产品编号是: "++" ,预定数量为: "+); (6000L); (" 处理完成! "); return ESS; } // 省略 set 、 get 方法。} 模拟重复提交的产景?2:配置 Action ?在 中配置 Action ,示例如下: <package name="product" extends="struts-default"> <action name="orderAction" class=""> <result>/order/</result> </action> </package> 模拟重复提交的产景?3:制作新增页面?提供新增页面来让用户输入:预定的产品编号和预定的数量,然后提交到上面的 Action ,示例代码如下: <%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>Insert title here</title> </head> <body> <s:form 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秒,自然没有什么问题。但是,如果用户在第一次提交还没有响应的时候,又再次点击了提交按钮,则同样的请求再次被提交,这时候,如果不加任何控制的话,同样的订单就将被处理两次了。可以在控制台中看到输出以下信息: 什么是令牌---- 百度百科?令牌基本思想:一个独特称为令牌的标志信息(一位或多位二进制数字组成的码)从一个节点发送到另一个节点,只有获得令牌的节点才有权发送信息包。当一个工作站准备发送报文信息时,首先要等待令牌的到来,当检测到一个经过他的令牌为空令牌时,即可以“帧”为单位发送信息,并将令牌置为忙向下一站发送信息。下一站按转发的方式转发经过本站但又不属于有本站接受的信息。由于环中已无空闲令牌,因此
⑩Struts2教程-防止重复提交(令牌) 来自淘豆网m.daumloan.com转载请标明出处.