Struts 防止重复提交方法
2013-11-05 00:00
309 查看
用户重复提交同一个HTML表单的原因不在乎两种:一是操作失误;二是某个表单的处理时间过长而使得用户不知该如何是好。在某些场合,重复提交同一个HTML表单的后果可能非常严重;在另外一些场合,这种情况也许只会令人敢不快而已。例如,在使用使用卡进行在线支付到时候,如果服务器的响应速度太慢,用户难免会再次点击提交按钮,而这就有可能导致那张信用卡上的金额被划走两次。我们再来看一个后果没那么严重的例子 -- 用来录入产品信息的表单,重复提交这些表单可能同一中产品被添加二次。
在防止重复提交同一个表单方面,不同的浏览器有这不同的行为。Mozilla Firefox浏览器对重复点击同一按钮将不予理睬,这为我们提供了某种形式的保护。其他品牌的浏览器,包括IE在内,目前还没有实现能够防止重复提交的功能。此外,Mozilla和非Mozilla浏览器都算上,如果在请求被处理之后按下了浏览器本身的Refresh/Reload(刷新)按钮。同样的请求就会被再次提交,而这显然是一种重复提交行为。因为,质押重复提交有可能给你的业务逻辑带来不良影响,你就必须采取必要的预防措施。
Struts已经内置了能够防止用户重复提交同一个HTML表单的功能。它采用的办法在其他一些用来开发Web应用程序的技术里也可以见到:让服务器生成一个唯一标记,并在服务器和表单里保存一份这个标记的副本。此后,在用户提交表单的时候,表单里的标记将虽说这其他请求参数一起发送到服务器,服务器将对它收到的标记和它留存的标记进行比较。如果两者匹配,这次从提交来的表单就是被认为是有效的,服务器将对之做出必要的处理并重新设置一个标记。随后(因为不小心)提交相同的表单就会失败,因为服务器上的标记已经重置。
1,struts2的防止重复提交,也使用到了token(令牌机制),并且使用到了struts2的一个叫token的拦截器
添加商品页面:
struts.xml
动作层:
java代码
错误页面:
显示商品信息页面:
注意:
a:当拦截器拦截到 当发生重复提交的action时候,会跳转到invalid.token指定的页面。
b:为了使用同一的错误页面,在错误页面上接受到message参数的值,可以在error.jsp使用 ${param['message']}
c:在提交页面的form中添加<s:token/>标签,需要在页面中加上。
2,struts2的防止重复提交,也使用到了token(令牌机制),并且使用到了struts2的一个叫token-session的拦截器
Token Session拦截器扩展了Token并提供了一种更复杂的服务。Token Session拦截器不想Token拦截器那样会返回一种特殊的结果并添加一个动作错误,它采用的做法只是阻断后续的提交,而这么做的后果是用户将看到同一的响应,就好像只有一次提交那样!
XML代码:
注意:
a:includeMethods 指定需要拦截的方法 excludeMethods 指定不需要拦截的方法,多个方法使用逗号分隔
b:把第一个程序的配置文件换成这个,不需要错误页面。
在防止重复提交同一个表单方面,不同的浏览器有这不同的行为。Mozilla Firefox浏览器对重复点击同一按钮将不予理睬,这为我们提供了某种形式的保护。其他品牌的浏览器,包括IE在内,目前还没有实现能够防止重复提交的功能。此外,Mozilla和非Mozilla浏览器都算上,如果在请求被处理之后按下了浏览器本身的Refresh/Reload(刷新)按钮。同样的请求就会被再次提交,而这显然是一种重复提交行为。因为,质押重复提交有可能给你的业务逻辑带来不良影响,你就必须采取必要的预防措施。
Struts已经内置了能够防止用户重复提交同一个HTML表单的功能。它采用的办法在其他一些用来开发Web应用程序的技术里也可以见到:让服务器生成一个唯一标记,并在服务器和表单里保存一份这个标记的副本。此后,在用户提交表单的时候,表单里的标记将虽说这其他请求参数一起发送到服务器,服务器将对它收到的标记和它留存的标记进行比较。如果两者匹配,这次从提交来的表单就是被认为是有效的,服务器将对之做出必要的处理并重新设置一个标记。随后(因为不小心)提交相同的表单就会失败,因为服务器上的标记已经重置。
1,struts2的防止重复提交,也使用到了token(令牌机制),并且使用到了struts2的一个叫token的拦截器
添加商品页面:
<body> <s:form action="product_doAddProduct.action" method="post"> <s:token></s:token> <s:textfield name="name" label="商品名称"></s:textfield> <s:textfield name="price" label="商品价格"></s:textfield> <s:submit value="提交"></s:submit> </s:form> </body>
struts.xml
<package name="token" extends="struts-default" namespace="/jsp"> <action name="product_*" class="org.cric.action.ProductAction" method="{1}"> <result name="success">/jsp/product.jsp</result> <result name="invalid.token">/jsp/error.jsp?message=重复提交</result> <interceptor-ref name="token"/> <span style="white-space: pre;"> </span><interceptor-ref name="defaultStack"/> </action> </package&g 3ff0 t;
动作层:
java代码
public String doAddProduct() throws Exception{ System.out.println("添加商品了……"); Thread.sleep(10000); return "success"; }
错误页面:
<body> ${param['message']} </body>
显示商品信息页面:
<body> 商品名称:<s:property value="%{name}"/><br> 商品价格:<s:property value="%{price}"/> </body>
注意:
a:当拦截器拦截到 当发生重复提交的action时候,会跳转到invalid.token指定的页面。
b:为了使用同一的错误页面,在错误页面上接受到message参数的值,可以在error.jsp使用 ${param['message']}
c:在提交页面的form中添加<s:token/>标签,需要在页面中加上。
2,struts2的防止重复提交,也使用到了token(令牌机制),并且使用到了struts2的一个叫token-session的拦截器
Token Session拦截器扩展了Token并提供了一种更复杂的服务。Token Session拦截器不想Token拦截器那样会返回一种特殊的结果并添加一个动作错误,它采用的做法只是阻断后续的提交,而这么做的后果是用户将看到同一的响应,就好像只有一次提交那样!
XML代码:
<package name="token" extends="struts-default" namespace="/jsp"> <action name="product_*" class="org.cric.action.ProductAction" method="{1}"> <result name="success">/jsp/product.jsp</result> <interceptor-ref name="token-session"> <param name="includeMethods">doAddProduct</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action> </package>
注意:
a:includeMethods 指定需要拦截的方法 excludeMethods 指定不需要拦截的方法,多个方法使用逗号分隔
b:把第一个程序的配置文件换成这个,不需要错误页面。
相关文章推荐
- SpringMVC数据验证
- struts2的s:iterator 标签
- 回看基础--Java内部类详解
- 一些关于cookie和java重定向的笔记
- Play项目创建与运行
- java移动文件到另一个文件夹中
- 设计模式(五)----- 原型模式(Prototype)----(JAVA版)
- JAVA程序的内存分配
- java字符串
- java io系列22之 FileReader和FileWriter
- java异常处理机制
- Struts2返回JSON数据的具体应用范例
- java synchronized 关键字
- java练习,,,从键盘输入次数,输出最大值,和
- java io系列21之 InputStreamReader和OutputStreamWriter
- Spring JDBC事务管理
- Eclipse Android SDK无法下载问题不翻墙解决办法只看楼主收藏
- java io系列20之 PipedReader和PipedWriter
- java学习脚印:几种迭代方式
- 书评:Java核心编程卷1——基础