注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

Struts2 防止表单重复提交解决方案  

2012-11-28 17:49:20|  分类: struts |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、使用场景:当用户提交了一个表单,此时,地址栏显示的是处理这个表单的Action的地址,若此时刷新,则会重新发送一次表单数据,即又进行了一次提交,若这个Action是用来处理用户注册的,那么重复提交会再一次向数据库中插入之前已经插入的数据。

二、解决方案:

有两种方法,可以防止表单重复提交,一种是用Action的重定向,一种是用Session TokenSession令牌)。第一种方法只说一下具体的实现思路,实例就不出了,这次只针对第二种解决方案进行详细的说明一下。

(1)实现思路:

Action处理完用户提交的数据后,重定向到另一个Action或是一个页面,使用户提交后,所停留的位置,不是当前处理数据的Action,这样用户再刷新时,就不会再次执行这个Action了,就会避免表单重复提交的问题了。

(2)实现思路:

这种方法是在用户要提交的表单中,加入一个<s:token>标签,这样,当浏览器第一次访问这个带有<s:token>标签的页面时,在服务器中,解析<s:token>标签的类(TokenTag.class),会生成一个随机的字符串(这个字符串,查看网页的源代码可以看到),并且发送给客户端的浏览器,同时,在服务器中,会把这个随机字符串保存到用户的session对象中。当第一次提交表单时,在服务器中,会比较客户端和服务器中分别保存的这个随机字符串,因为是第一次提交,所以这两个字符串相等,然后进行正常的业务处理。第一次提交后,在服务器中的session中保存的这个随机字符串,会改变为其他的随机值,注意,这是很重要的一步!此时,地址栏停留在处理用户提交数据的Action中,客户端中保存的随机字符串没有改变,若是刷新页面,即重复提交,服务器再进行两个字符串的比较,会不相等,就会跳转到nameinvalid.token的结果页面中,这样就会防止表单重复提交了。

具体实现:

第一步:配置拦截器

Java代码 
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <package name="common" extends="struts-default" namespace="/common">        
  7.         <interceptors>  
  8.             <interceptor-stack name="loginStack">  
  9.                 <interceptor-ref name="defaultStack"></interceptor-ref>  //接收参数
  10.                 <interceptor-ref name="token"></interceptor-ref>  
  11.             </interceptor-stack>  
  12.         </interceptors>  
  13.         <default-interceptor-ref name="loginStack"></default-interceptor-ref>  
  14.         <action name="loginAction_*" class="loginAction" method="{1}">  
  15.             <result name="success">/welcome.jsp</result>  
  16.           <!-- 一个是重复提交的处理,一个是没有表单标记时的处理 -->
  17.             <result name="invalid.token" type="redirect">/index.jsp</result>  
  18.             <result name="input"  type="redirect">/index.jsp</result>  
  19.         </action>  
  20.     </package>      
  21. </struts>  

第二步:配置JSP页面
<%@taglib prefix="s" uri="/struts-tags" %>  

  1. <s:form action="" name="form1" method="post">  
  2. <s:token></s:token>  
  3. </s:form>  

第三步:查看结果

 页面上会看到输出两个隐藏域:


  1. <input type="hidden" name="struts.token.name" value="struts.token"/>  
  2. <input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>  

 

这就是你当前表单的标记,如果没有标记,则返回INPUT,如果标记重复就是重复提交返回invalid.token! 

  评论这张
 
阅读(308)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016