情况是这样的。。
我有一个方法 运行完毕大概需要30秒(里面有Thread.sleep)。方法如果运行到一半,我在按页面上的提交也就是说重新执行了这个action.请问如何防止要在方法运行完以后才能继续提交?

解决方案 »

  1.   


    这个拦截器查了下 是struts2的么。1有么。。
      

  2.   

    struts1也有的,但不叫拦截器,叫令牌
      

  3.   

    最好的办法还是使用TOKEN(令牌),当然页面按钮给它置灰最好不过了
      

  4.   

    也就是让这个submit失效,那怎样解决方法结束重新有效呢
      

  5.   

    Struts 1 中也有,就算使用 Servlet 也可以自行实现。
      

  6.   

    Struts自带的方式(令牌):服务器端发放一次性使用的令牌方式,服务器端给客户端每次请求发一个令牌,在客户端提交之后,检查令牌,如果这个令牌是第一次使用,就ok;否则,提示重复提交。 
    Action中有个几个相关方法: 
    SaveToken(request):生成一个新的令牌,并保存到客户端的请求对象中。 
    IsTokenValid(request,true):检查客户端的令牌是否是第一次使用,并且使该令牌失效。 
    ResetToken(request):重置客户端的令牌。 
      

  7.   

    1:提交页面前一个action this.saveToken(request); 
    2:提交页面 
    <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value= "<%=session.getAttribute("org.apache.struts.action.TOKEN")%>"/> 
    3:处理提交的action 
    if(isTokenValid(request,true)){ 
      //commonDataBean.executeUpdate(sql);//处理执行sql语句代码 
      resetToken(request); 
    }else{ 
      this.saveToken(request); 
      

  8.   

     if (!isTokenValid(request, true)) { 
       
      resetToken(request); 
       
      saveError(request, new ActionMessage("error.repeatSubmit")); 
       
      log.error("重复提交!"); 
       
      return mapping.findForward("error"); 
       
      } 
    问题是 我第一次进这个action 是正确的,正常情况下是return mapping.findForward("success"); 
    如果我在调用次这个action,触发令牌不正确,也就是说进入了else{},那else里也有个return,
    return mapping.findForward("error"); 
    那我想跳转的是success这个页面,可现在进了else的error页面,如何解决。。
      

  9.   

    其实我防止重复提交可以实现 代码如下:
    public ActionForward service_test_run(ActionMapping mapping,
    ActionForm form, HttpServletRequest request,
    HttpServletResponse response) throws Exception {
    if (request.getSession().getAttribute("service_test_run2") == null) {
    request.getSession().setAttribute("service_test_run2",
    "service_test_run2");
                                ………………………………(执行代码)……………………
                    request.getSession().removeAttribute("service_test_run2");
    return mapping.findForward("service_test_over");

               else { ActionMessages messages = new ActionMessages();
    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.service_test_run"));
    saveMessages(request, messages);
    return mapping.findForward("service_test");
    }return 到其他页面去了
      

  10.   

    要加锁        final HttpSession se = request.getSession();
            boolean repeat = true;
            synchronized (se) {
                if (se.getAttribute("repeat") == null) {
                    repeat = false;
                    se.setAttribute("repeat", new byte[0]);
                }
            }
            if (repeat) {
                //重复提交
                return;
            }
            try {
                //
            } finally {
                synchronized (se) {
                    se.removeAttribute("repeat");
                }
            }
      

  11.   

        if (repeat) {
                //重复提交
                return;
            }
    这里不也return出去了么应该最好写在js里,让提交都不行。。可该怎样写呢。
    我试过在session里放值,然后JS得到做判断,可只有当和页面有交互才能得到session的值。。
      

  12.   


    楼主,不要让我怀疑你的智商问题好吗?
    1。else就一定要进return error吗?随便你怎么处理啊,你可以写个提示我无比的晕
    2。你写的那个方法原理和我的类似,但是你少考虑了一个问题,你的这个方法不同用到2个地方
    比如提交功能A,要求不能重复提交,你保存了一个标识
    那么我想要功能B也要求不能重复提交,你又保存一个标识?很明显之保存一个是不行的
      

  13.   

    else 不管return 是不是error 我本来正常是returun A;然后else 除了也写return A;否则不可能进的是同一个页面对吧?
      

  14.   

    。无语,不知道你到底想要什么,我在教小学生?
    你当然可以写
    逻辑
    if(不是重复提交){
     return SUCCESS;
    }else{
      //重复提交,可以给用户提示
      request.setAttribute("不可以重复提交");
     return SUCCESS;
    }
      

  15.   

    是我自己问题。。我本来想else也到成功页面 那用户关掉ie 咋办。MB 其实我这个程序已经运行了。管他关不关。。是我自己一下子懵掉了。。
      

  16.   

    如果要考虑给客户好的体验,可以考虑用ajax请求,这样提示方便