Struts防止重复提交

适用场景:在从页面向数据库中插入数据时,比如用户注册,提交留言等,当操作成功之后,再点击“后退”按钮,退回到表单页再次提交表

单,如果对此重复提交未加处理,将会再次提交成功,数据库中就会有重复的数据,这种情况是不合理的。

 

Struts解决方案:Struts框架的令牌机制(TOKEN)很好的解决了这个表单重复提交的问题。

基本原理:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

 

下面通过一个例子来说明:

例子操作内容:通过留言板向数据库中插入一条留言记录。

文件包括:

messageAdd.jsp   

messageSubmit.jsp

messageError.jsp

messageSuccess.jsp

messageAction.java

messageForm.java

struts-config.xml

 

messageAdd.jsp

 

   

    防止重复提交

 

 

       我要留言

 

 

 

messageSubmit.jsp

 

       

    add.jsp

 

 

  

    

      

        

             留言

        

     

      

        

           

        

      

      

        

            提交"/>

            重置"/>

        

      

    

  

 

 

messageError.jsp

 

    错误页面

 

 

       请不要重复提交

 

 

messageSuccess.jsp

 

    成功页面

 

 

       留言成功

 

MessageAction.java

public class MessageAction extends DispatchAction

{

       public ActionForward add(ActionMapping mapping, ActionForm. form, HttpServletRequest request, HttpServletResponse response)

       {

              TokenProcessor processor=TokenProcessor.getInstance();

              processor.saveToken(request);

              return mapping.findForward("add");

       }

       public ActionForward insert(ActionMapping mapping, ActionForm. form, HttpServletRequest request, HttpServletResponse response)

       {

              MessageForm. strutsForm=(MessageForm)form;

              String message=strutsForm.getContent();

              TokenProcessor processor=TokenProcessor.getInstance();

              String tour1="error";

              if(message!=null&&!"".equals(message))

              {

                     if(processor.isTokenValid(request,true))

                     {

                            tour1="success";

                     }

                     else

                     {

                            processor.saveToken(request);

                     }

              }

              return mapping.findForward(tour1);

       }

}

MessageForm.java

public class MessageForm. extends ActionForm

{

       private static final long serialVersionUID = 1L;

       private String content="";

 

       public String getContent()

       {

              return content;

       }

 

       public void setContent(String content)

       {

              this.content = content;

       }

      

}

 

struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>

/FONT>"http://struts.apache.org/dtds/struts-config_1_2.dtd">

      

      

          

            type="com.xinglongjian.struts.action.MessageForm" />

      

      

       

         

            type="com.xinglongjian.struts.action.MessageAction" >

             

             

             

       

      

 

注意事项:

1 TokenProcessor类,这个类是对Token进行操作的。可以查看源代码弄明白saveToken(request),isTokenValid(request,true)等方法的具体实现。

 从代码中可以看出,token值是由用户的Session ID 和当前时间算出来的,并将其放入session中,keyGlobals.TRANSACTION_TOKEN_KEY

2,页面中form标签要用struts的标签原因是:因为当应用服务器初始化填写表单页面遇到标签时,便会调用strutsFormTag类的renderToken()方法。该方法会当检测到session中的Globals.TRANSACTION_TOKEN_KEY不为空时,在填写表单页面创建元素:


名称为:org.apache.struts.taglib.html.TOKEN就是Constants.TOKEN_KEY
值为:session中的Globals.TRANSACTION_TOKEN_KEY的值. 

另外必须在struts-config.xml中配置form-bean,而且name属性值要与actionname属性值一致,因为strutsform标签与一个Form对象对应。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7464531/viewspace-621630/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7464531/viewspace-621630/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值