兄弟,利用Token可以解决重复重复提交:Struts利用同步令牌(Token)的方式来解决Web应用中重复提交的问题,其机制是在form表单中增加一个隐藏的域,保存当前令牌值,然后在程序中判断此令牌值是否合法.
org.apache.struts.action.Action类提供了相关操作Token的方法:
1、isTokenValie方法:
判断存储在当前用户会话中的令牌值和请求参数中的令牌值是否匹配.如果匹配,返回true,反之返回false.只要符合下列情况之一的,就会返回false:
不存在HttpSession对象;
在session范围内没有保存令牌值;
在请求参数中没有令牌值;
存储在当前用户session范围内的令牌值和请求参数中的令牌值不匹配.
2、resetToken方法:
从当前session范围内删除令牌属性.
3、saveToken方法:
创建一个新的令牌,并把它保存在当前session范围内.如果HttpSession不存在,就首先创建一个HttpSession对象.如何利用上述方法应用令牌机制解决重复提交问题:
以用户注册为例:
在用户请求newUser.jsp之前,首先把请求转发到PrepareAction,PrepareAction 调用saveToken方法,创建一个新的令牌,并将令牌值保存在当前HttpSession中(新创建的),PrepareAction接着把请求转发给newUser.jsp.newUser.jsp中的<html:form>标签自动判断在session范围内是否存在Token,如果存在,就自动在表单中生成一个包含Token信息的隐藏字段,例如: 
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="....">在用户提交表单后,由InsertUserAction处理请求.在InsertUserAction中,调用isTokenValid方法,判断当前用户会话中的令牌值和请求参数中的令牌值是否匹配.如果匹配,就调用resetToken方法,删除Token,然后执行插入数据操作.如果不匹配,返回相关错误提示,进行相关操作.OK.酱紫就可以有效放置重复提交了.如何在不使用Struts的前提下利用令牌机制解决重复提交问题:
Struts的令牌机制有几个要点可以让我们在普通的JSP/Servlet中解决重复提交问题.
1、提供几个操作Token的相关方法:
关键有三个:
resetToken(HttpServletRequest request)-->重置令牌值.
saveToken(HttpServletRequest request)-->保存令牌值.
isTokenValid(HttpServletRequest request)-->检测令牌是否合法.2、在form表单中增加隐藏域,保存当前令牌值.3、在执行持久性数据操作之前调用相关方法判断当前令牌是否合法,之后在进行相关操作.方法是相同的,只是实现的方式不太一样.truts1.1 API关于几个Token操作方法的说明:protected  boolean isTokenValid(javax.servlet.http.HttpServletRequest request) 
          Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it. protected  boolean isTokenValid(javax.servlet.http.HttpServletRequest request, boolean reset) 
          Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it. protected  void resetToken(javax.servlet.http.HttpServletRequest request) 
          Reset the saved transaction token in the user's session. protected  void saveToken(javax.servlet.http.HttpServletRequest request) 
          Save a new transaction token in the user's current session, creating a new session if necessary.

解决方案 »

  1.   

    或者也可以试试利用一个简单的javascrpt flag 变量来防止重复提交,var haveSubmitted = false;function onClickHyperLink(){
        if(haveSubmitted){
           return;
        }else{
           haveSubmitted = true;
           XXX_from.submit();
        }
    }
      

  2.   

    你的代码看的头大哦,能不能把处理放到业务层去处理啊,action都能写的如此庞大,而且还有网页代码,你是古今第一人哦。
    你应该把跳转前的代码,也就是象服务器提交的东西检查一下,完了跳转以后,这样吧,你在Session   dbsession   =   HibernateUtil.getSessionFactory().getCurrentSession(); 这里设置一个断点,看看两次进来提交的参数是那些,有什么不同的
      

  3.   

    要是menu被累加了的话,大概是这个原因:第一次请求没有完成时action的实例还没有被销毁,接到第二次请求的时候由于内存中还有这个action的实例,所以不会去在创建新的实例,而你的menu又是static类型的,自然就会把两次的查询结果累加起来。
      

  4.   

        功能就是做一个菜单类型的东西, 大概就是楼上大哥说的意思   内容被累加起来了,单我定义的不是static变量,只是全局变量而已。如果跟你说的一样他不会去创建新的实例 我应该怎么处理啊 
      

  5.   

             问题解决   我把代码写在单独类里面就好了,Action的实例应该是没有销毁  呵呵  谢谢大家了