java处理重复提交

来源:互联网 发布:java accept函数 编辑:程序博客网 时间:2024/06/04 17:45
举个例子:  
  〈html:link   action="subject.do?method=add"〉我要发贴〈/html:link〉  
  subject.do   和   method   这些在struct-config.xml如何定义我就不说了,点击链接后,会执行subject.do的add方法,代码如上面说的,跳转到subjectAdd.jsp页面。页面的代码大概如下:  
  〈html:form   action="subjectForm.do?method=insert"〉  
      〈html:text   property="title"   /〉  
      〈html:textarea   property="content"   /〉  
      〈html:submit   property="发表"   /〉  
      〈html:reset   property="重填"   /〉  
  〈html:form〉  
  如果你在add方法里加了“saveToken(request);”这一句,那在subjectAdd.jsp生成的页面上,会多一个隐藏字段,类似于这样〈input   type="hidden"   name="org.apache.struts.taglib.html.TOKEN"   value="6aa35341f25184fd996c4c918255c3ae"〉,  
  2、点击发表后,表单提交到subjectForm.do里的insert方法后,你在insert方法里要将表单的数据插入到数据库中,如果没有进行重复提交的控制,那么每点击一次浏览器的刷新按钮,都会在数据库中插入一条相同的记录,增加下面的代码,你就可以控制用户的重复提交了。  
  if   (isTokenValid(request,   true))   {  
  //   表单不是重复提交  
  //这里是保存数据的代码  
  }   else   {  
  //表单重复提交  
  saveToken(request);  
  //其它的处理代码  
  }  
  注意,你必须在add方法里使用了saveToken(request),你才能在insert里判断,否则,你每次保存操作都是重复提交。  
  记住一点,Struts在你每次访问Action的时候,都会产生一个令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了saveToken(request);,那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。  
  如果你在你Action的方法里使用了isTokenValid,那么Struts会将你从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。  
   
  由于我们项目的所有Action都是继承自BaseDispatchAction这个类,所以我们基本上都是在这个类里面做了表单重复提交的控制,默认是控制add方法和insert方法,如果需要控制其它的方法,就自己手动写上面这些代码,否则是不需要手写的,控制的代码如下:  
  public   abstract   class   BaseDispatchAction   extends   BaseAction   {  
  protected   ActionForward   perform(ActionMapping   mapping,   ActionForm   form,  
          HttpServletRequest   request,   HttpServletResponse   response)  
          throws   Exception   {  
                  String   parameter   =   mapping.getParameter();  
                  String   name   =   request.getParameter(parameter);  
    if   (null   ==   name)   {   //如果没有指定   method   ,则默认为   list  
                          name   =   "list";  
                  }  
   
                  if   ("add".equals(name))   {  
                          if   ("add".equals(name))   {  
                                  saveToken(request);  
                          }  
                  }   else   if   ("insert".equals(name))   {  
                          if   (!isTokenValid(request,   true))   {  
                                  resetToken(request);  
                                  saveError(request,   new   ActionMessage("error.repeatSubmit"));  
                                  log.error("重复提交!");  
                                  return   mapping.findForward("error");  
                          }  
                  }  
                  return   dispatchMethod2(mapping,   form,   request,   response,   name);  
          }  
  }
原创粉丝点击