用forward我觉得是不能消除这个问题的,forward后URL路径仍然是原来的url,而你点刷新的时候是先请求原先的url,自然就带了参数把你的业务再执行一遍了,所以我建议你用redirect吧

解决方案 »

  1.   

    可是redirect 能把request的内容带过去吗??,forward可是有参数的
      

  2.   

    在提交页页上随机创建一个数值存在session中并存于一个隐藏域中。
    接收的Servlet或别的任何接收该表单提交的处理程序先判断session中的这个随机数
    是否与表单中的隐藏域的值相等,如果相等就继续,完毕后将session的这个值清除掉。因为你刷新时,实际上是再次提交了这个表单。那么表单的隐藏域上的值一定还存在。
    但是如果你提交成功后,session的值已经被你清掉,所以再次刷新时session的值一
    定与你提交过来的值不相等,所以就是刷新页面提交了。
      

  3.   

    同意楼上,这也可解决删除后点后退再次进行删除的问题,
    另外也可以使用redirect,不过效果没有楼上的那种更好~~
      

  4.   

    贴点JSF的实现代码(防止delete时刷新重复操作):页面:
                <input type="hidden" value="#{userForm.version}"/>UserForm.java中部分相关代码
        private String version;     {
            if(version == null || "".equals(version))
            // version 随机数,在类初始化时产生,也可以写在getVersion()方法中
            version = String.valueOf((int) Math.floor((Math.random() * 10000)));
        }
        public String getVersion() {
            FacesUtils.getSession().setAttribute("version",version);
            return version;
        }
        public String delete() {
            if(FacesUtils.getSession().getAttribute("version")!=null){
                userManager.removeUser(String.valueOf(user.getUserId()));
                FacesUtils.getSession().removeAttribute("version");
            }        return "list";
        }
        .... //省略若干行无关代码
    }
      

  5.   

    可是redirect 能把request的内容带过去吗??,forward可是有参数的
    ---------------------------------------------------------------------------------用redirect();跳转一样可以传值的,下面:
    redirect("http://localhost:8080/main.jsp?id=值 & password=值");
    跳转就可以了,如果你要传动态的值,用“+”把里面的字符串分开就可以了,如
    redirect("http://localhost:8080/main.jsp?id=" + 变量名 + " & password=" + 变量名);LZ试试吧!
      

  6.   

    这是我们项目中负责控制的Mainservelet转发的关键代码  private void dispatch(RequestPage requestPage, String page)
            throws ServletException, IOException {
            log.debug("Command dispath request to: " + page);
            RequestDispatcher disp = this.getServletContext().getRequestDispatcher(page);
            disp.forward(requestPage.getRequest(), requestPage.getResponse());
        }转发后浏览器地址和界面显示不符,所以刷新会导致重复提交, 不知道怎么修改
    我改为redirect却不知道requestPage.getRequest(), requestPage.getResponse()怎么传过去,他们中包含大量的返回值,是必须传递的!!!谢谢各位,请帮帮。
      

  7.   

    1、requestPage放在session中传递;
    2、重新设计你的业务逻辑,不要把“大量的返回值”增删改后传递;
      

  8.   

    要返回自己设计的一些持久类啊,pojo ,vo 什么的
      

  9.   

    emin_lee() ( ) 信誉:100 
    1、requestPage放在session中传递;
    =========================================
    那我的代码比如:
    Page.getRequest().setAttribute("statsMap", statsMap);就必须改为
    page.getSession().setAttribute("statsMap", statsMap);了吗??那工作量可不小啊?太多了
      

  10.   

    我记得structs里有redirect=true这样的设置,不知道程序怎么实现这个效果
    控制用户有没有提交这个状态 好像不太简洁啊。其实只要实现浏览器地址和内容一直就行了,郁闷中^。。
      

  11.   

    重复提交的几种解决方案:
    1、运用页面session(不建议)
    2、运用ajax技术(当今比较流行的啦)
    3、运用隐藏iframe进行提交(推荐)
    4、服务器端改变跳转路径
      

  12.   

    确实不太好解决。不过你可以在你的框架里使用struts的token
      

  13.   

    呵呵~
    曾经我也遇到过与你一样的问题,
    思前想后了很久,都没有得到解决办法,
    当时想,除非能够重新手工创建一个新的request,
    呵呵
    这是不现实的!如果要使用ajax
    或者使用struts等重新构建你的开发架构,
    或者重写业务逻辑,
    对你而言,都是工作量更大的。暂时没有什么好办法~
      

  14.   

    是不是forward里面的地址没有取正确?
    用request.getRequestURI()+"?"+request.getQueryString()看