站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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()看


跳到一个不相干的页面是常见的处理方法,可以楼主还要传递大量的数据,甚至对象,呵呵,这就麻烦了:)


郁闷揭帖!!!


↑返回目录
前一篇: POI操作Excel
后一篇: 书中的例子 现在有点错误 ,怎样更改