请教:关于避免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);
//其它的处理代码
}
}
------解决方案--------------------
------解决方案--------------------记录加锁
数据只能提交一次。
------解决方案--------------------首先去你的添加页面前加一句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);
//这里写你的保存代码
}
------解决方案--------------------上传成功也可以转向一个成功提示页面,这样就避免刷新重复提交了