求:用.forward控制页面时如何避免用户刷新页面导致重复提交(没用任何框架)? 用forward我觉得是不能消除这个问题的,forward后URL路径仍然是原来的url,而你点刷新的时候是先请求原先的url,自然就带了参数把你的业务再执行一遍了,所以我建议你用redirect吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可是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 呵呵~曾经我也遇到过与你一样的问题,思前想后了很久,都没有得到解决办法,当时想,除非能够重新手工创建一个新的request,呵呵这是不现实的!如果要使用ajax或者使用struts等重新构建你的开发架构,或者重写业务逻辑,对你而言,都是工作量更大的。暂时没有什么好办法~ 是不是forward里面的地址没有取正确?用request.getRequestURI()+"?"+request.getQueryString()看 想给公司再做一个框架,大家说说要注意什么,谢谢 希望前辈们给些建议,JavaEE大作业!!! Httpunit 解决 javascript 的问题 谁有做电信系统的代码啊? JSP调用JavaBean,设置属性的时候怎样捕捉异常? 在jbuilder2005中如何配置数据源?如何应用servlet? hibernate.cfg.xml应该放到哪里呢? 求教JAVA的集成IDE开发环境 在javamail中如何判断一个邮件的状态 我在想问一下,联通的短信有没有提供java api? 一个急手的js和jsp数据交换问题,各位帮帮忙!!! 问个Spring方面的问题
接收的Servlet或别的任何接收该表单提交的处理程序先判断session中的这个随机数
是否与表单中的隐藏域的值相等,如果相等就继续,完毕后将session的这个值清除掉。因为你刷新时,实际上是再次提交了这个表单。那么表单的隐藏域上的值一定还存在。
但是如果你提交成功后,session的值已经被你清掉,所以再次刷新时session的值一
定与你提交过来的值不相等,所以就是刷新页面提交了。
另外也可以使用redirect,不过效果没有楼上的那种更好~~
<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();跳转一样可以传值的,下面:
redirect("http://localhost:8080/main.jsp?id=值 & password=值");
跳转就可以了,如果你要传动态的值,用“+”把里面的字符串分开就可以了,如
redirect("http://localhost:8080/main.jsp?id=" + 变量名 + " & password=" + 变量名);LZ试试吧!
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()怎么传过去,他们中包含大量的返回值,是必须传递的!!!谢谢各位,请帮帮。
2、重新设计你的业务逻辑,不要把“大量的返回值”增删改后传递;
1、requestPage放在session中传递;
=========================================
那我的代码比如:
Page.getRequest().setAttribute("statsMap", statsMap);就必须改为
page.getSession().setAttribute("statsMap", statsMap);了吗??那工作量可不小啊?太多了
控制用户有没有提交这个状态 好像不太简洁啊。其实只要实现浏览器地址和内容一直就行了,郁闷中^。。
1、运用页面session(不建议)
2、运用ajax技术(当今比较流行的啦)
3、运用隐藏iframe进行提交(推荐)
4、服务器端改变跳转路径
曾经我也遇到过与你一样的问题,
思前想后了很久,都没有得到解决办法,
当时想,除非能够重新手工创建一个新的request,
呵呵
这是不现实的!如果要使用ajax
或者使用struts等重新构建你的开发架构,
或者重写业务逻辑,
对你而言,都是工作量更大的。暂时没有什么好办法~
用request.getRequestURI()+"?"+request.getQueryString()看