ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Struts防止重复提交

Struts防止重复提交

原创 Linux操作系统 作者:xinglongjian 时间:2009-12-04 12:53:40 0 删除 编辑

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

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

 

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

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

 

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

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

文件包括:

messageAdd.jsp   

messageSubmit.jsp

messageError.jsp

messageSuccess.jsp

messageAction.java

messageForm.java

struts-config.xml

 

messageAdd.jsp

<%@ page language="java" pageEncoding="gbk"%>

 

    <%@include file="/header.jsp" %>

    </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">防止重复提交</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">

 

 

       我要留言

 

 

 

messageSubmit.jsp

<%@ page language="java" pageEncoding="gbk"%>

 

    <%@include file="/header.jsp"%>   

    add.jsp

 

 

  

    

      

        

     

      

        

      

      

        

      

    

             留言

        

           

        

            提交"/>

            重置"/>

        

  

 

 

messageError.jsp

<%@ page language="java" pageEncoding="UTF-8"%>

 

    </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">错误页面</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">

 

 

       请不要重复提交

 

 

messageSuccess.jsp

<%@ page language="java" pageEncoding="UTF-8"%>

 

    </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成功页面</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">

 

 

       留言成功

 

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

"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中,key为Globals.TRANSACTION_TOKEN_KEY

2,页面中form标签要用struts的标签原因是:因为当应用服务器初始化填写表单页面遇到标签时,便会调用struts的FormTag类的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属性值要与action的name属性值一致,因为struts的form标签与一个Form对象对应。

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

请登录后发表评论 登录
全部评论

注册时间:2009-09-25

  • 博文量
    7
  • 访问量
    19757