当前页面: 开发资料首页 → J2EE 专题 → 求:用.forward控制页面时如何避免用户刷新页面导致重复提交(没用任何框架)?
求:用.forward控制页面时如何避免用户刷新页面导致重复提交(没用任何框架)?
摘要: 求:用.forward控制页面时如何避免用户刷新页面导致重复提交(没用任何框架)?
程序没有用到struts等框架,所以大家不要说与其相关的办法
是不是不好弄?
mark!
用forward我觉得是不能消除这个问题的,forward后URL路径仍然是原来的url,而你点刷新的时候是先请求原先的url,自然就带了参数把你的业务再执行一遍了,所以我建议你用redirect吧
顶。
可是redirect 能把request的内容带过去吗??,forward可是有参数的
在提交页页上随机创建一个数值存在session中并存于一个隐藏域中。
接收的Servlet或别的任何接收该表单提交的处理程序先判断session中的这个随机数
是否与表单中的隐藏域的值相等,如果相等就继续,完毕后将session的这个值清除掉。
因为你刷新时,实际上是再次提交了这个表单。那么表单的隐藏域上的值一定还存在。
但是如果你提交成功后,session的值已经被你清掉,所以再次刷新时session的值一
定与你提交过来的值不相等,所以就是刷新页面提交了。
同意楼上,这也可解决删除后点后退再次进行删除的问题,
另外也可以使用redirect,不过效果没有楼上的那种更好~~
贴点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";
}
.... //省略若干行无关代码
}
可是redirect 能把request的内容带过去吗??,forward可是有参数的
---------------------------------------------------------------------------------
用redirect();跳转一样可以传值的,下面:
redirect("http://localhost:8080/main.jsp?id=值 & password=值");
跳转就可以了,如果你要传动态的值,用“+”把里面的字符串分开就可以了,如
redirect("http://localhost:8080/main.jsp?id=" + 变量名 + " & password=" + 变量名);
LZ试试吧!
这是我们项目中负责控制的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()怎么传过去,他们中包含大量的返回值,是必须传递的!!!
谢谢各位,请帮帮。。。。。。。
1、requestPage放在session中传递;
2、重新设计你的业务逻辑,不要把“大量的返回值”增删改后传递;
要返回自己设计的一些持久类啊,pojo ,vo 什么的
emin_lee() ( ) 信誉:100
1、requestPage放在session中传递;
=========================================
那我的代码比如:
Page.getRequest().setAttribute("statsMap", statsMap);
就必须改为
page.getSession().setAttribute("statsMap", statsMap);
了吗??
那工作量可不小啊?太多了
一定要自己控制用户有没有提交这个状态。
我记得structs里有redirect=true这样的设置,不知道程序怎么实现这个效果
控制用户有没有提交这个状态 好像不太简洁啊。
其实只要实现浏览器地址和内容一直就行了,郁闷中^。。。。。
重复提交的几种解决方案:
1、运用页面session(不建议)
2、运用ajax技术(当今比较流行的啦)
3、运用隐藏iframe进行提交(推荐)
4、服务器端改变跳转路径
确实不太好解决。不过你可以在你的框架里使用struts的token
mark
呵呵~
曾经我也遇到过与你一样的问题,
思前想后了很久,都没有得到解决办法,
当时想,除非能够重新手工创建一个新的request,
呵呵
这是不现实的!
如果要使用ajax
或者使用struts等重新构建你的开发架构,
或者重写业务逻辑,
对你而言,都是工作量更大的。
暂时没有什么好办法~
放刷新最好的做法是操作完了,跳到另一个不相关的页面去
这样怎么刷新也不好使了
是不是forward里面的地址没有取正确?
用request.getRequestURI()+"?"+request.getQueryString()看
跳到一个不相干的页面是常见的处理方法,可以楼主还要传递大量的数据,甚至对象,呵呵,这就麻烦了:)
郁闷揭帖!!!