日期:2014-05-20  浏览次数:20866 次

请教:关于避免F5刷新造成重复提交的一般性讨论
在SSH框架下做一个文件上传,然后显示文件列表的功能。发现提交之后,刷新文件列表会造成重复刷新,我把问题归结为:
1. request1 为带上传文件内容form的请求。其对应的path 为 upload.do
2. 在处理upload.do的Action中,上传完成后,转到列表显示功能的list.do(或者随便什么地方),但无论怎么转,最后只能返回需要的页面,却无法改变IE中地址栏中的“upload.do”,也就导致按F5会重复执行upload.do
3. 只有当response 返回客户端,才能通过javascript:parent.window.location='#' 来改变其url

以上是我理解的情况,也就是说当用户请求的url与返回的url不一致时,请求的url并不会自动改变。
请问有什么办法在服务器端设置IE地址栏么?使得response返回的时候url能自动改变。

------解决方案--------------------
struts有一个禁止重复提交的东西,你可以试试
public ActionForward add(ActionMapping mapping, ActionForm form, 

  HttpServletRequest request, HttpServletResponse response) 

  //前面的处理省略 

  saveToken(request); 

  return mapping.findForward("add"); 

  }在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示: 

  public ActionForward insert(ActionMapping mapping, ActionForm form, 

  HttpServletRequest request, HttpServletResponse response) 

  if (isTokenValid(request, true)) { 

  // 表单不是重复提交 

  //这里是保存数据的代码 

  } else { 

  //表单重复提交 

  saveToken(request); 

  //其它的处理代码 

  } 

  }
------解决方案--------------------
探讨
struts有一个禁止重复提交的东西,你可以试试
public ActionForward add(ActionMapping mapping, ActionForm form,

  HttpServletRequest request, HttpServletResponse response)

  //前面的处理省略

  saveToken(request);

  return mapping.findForward("add");

  }在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示:

  public ActionForward inser…

------解决方案--------------------
记录加锁
数据只能提交一次。
------解决方案--------------------
首先去你的添加页面前加一句saveToken(request)在转向到你的添加页面,可以是同一个action,或者是另一个action,这样会在你的页面生成一个hidden的参数是个唯一值来的
然后在提交的action中判断
if (!this.isTokenValid(request)) {
ActionMessages errors = new ActionMessages();
errors.add("insertSystemUser", new ActionMessage("errors.insertSystemUser"));
this.saveErrors(request, errors);
this.saveToken(request);
return mapping.getInputForward();
} else {
this.resetToken(request);
//这里写你的保存代码
}
------解决方案--------------------
上传成功也可以转向一个成功提示页面,这样就避免刷新重复提交了