《研磨struts2》第十七章 防止重复提交
研磨struts2
2012-06-18
所谓重复提交,就是用户在页面多次点击提交按钮,或者通过不断刷新页面,把已经提交过的数据多次向后台提交。 重复提交对于查询类的功能,问题还不是太大,但是对于新增或是修改类的功能,就有可能凭空的出现很多同样信息的重复数据,从而导致业务功能出现错误。 用一个实例来让大家体会一下重复提交的问题,来实现一个订单新增的功能,订单号一般都是由后台自动生成,前台页面只要传递订购人、订购商品和订购数量等订单的具体信息过来就可以了。为了示例的简洁,只是从前台传递一个订购的商品和一个订购的数量,一共两个值就可以了,就不去处理什么订单的主记录、子记录等复杂的功能了。 1:实现Action 写一个处理订单的Action,接收前台传递过来的数据,然后输出即可。为了表示会花一定的时间来进行业务处理,在execute方法里面,让线程休息6秒,示例代码如下:
java代码:
2:配置Action 在struts.xml中配置Action,示例如下:
java代码:
java代码:
java代码:
4:运行测试 运行新增页面,填写数据,然后点击提交。由于Action中,让当前线程sleep了6秒钟,所以必须等6秒之后才能正确的结束调用。 如果这个时候用户乖乖的等足6秒,自然没有什么问题。但是,如果用户在第一次提交还没有响应的时候,又再次点击了提交按钮,则同样的请求再次被提交,这时候,如果不加任何控制的话,同样的订单就将被处理两次了。 可以在控制台中看到输出以下信息:
java代码:
很明显数据重复了,这种重复提交的问题,会给业务处理带来很多的麻烦,应该在开发中杜绝这个问题。 使用Struts2框架来进行开发的话,它已经替我们想好了应对之策,还专门为此提供了<s:token/>标签,接下来就来具体看看它的使用。
私塾在线网站原创《研磨struts2》系列 转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4149.html】 欢迎访问http://sishuok.com获取更多内容
17.2.1 使用<s:token/>标签入门Token也被称做令牌,所以使用<s:token/>标签防止重复提交,也常被称做使用令牌防止重复提交。 1:修改页面 <s:token/>标签的使用非常简单,只需要在提交页面的<s:form>标签内加上子标签<s:token/>就可以了。 如果把提交页面当做重复提交时返回的结果页面的话,通常还需要在这个页面上引用重复提交时的错误信息。重复提交的错误信息以动作错误信息的方式存在,所以我们只要用<s:actionerror/>标签来引用即可。示例代码如下:
java代码:
2:修改struts.xml 使用<s:token/>标签,必须为Action引用名为token的预定义拦截器,它并不在defaultStack拦截器栈里,所以需要手动的引用token拦截器。 如果有重复提交的行为,Struts2将跳转到这个Action定义的名为invalid.token的Result,因此,需要修改struts.xml,示例代码如下:
java代码:
我们并没有修改TokenAction。那么,现在再次访问订单提交页面,且再次两次提交,可以看到页面跳转到invalid.token指定的Result,其实就是原来的提交页面,并输出重复提交的提示信息,如图所示: 图17.1 页面被重定向到指定的invalid.token结果 再看看控制台的输出,应该只有一次输出了,示例如下:
java代码:
|
|
gc715409742
2012-06-25
可以定义需要防止重复提交的方法:
<interceptor-ref name="token"> <param name="includeMethods">pwdUpdate</param> </interceptor-ref> |