论坛首页 Java企业应用论坛

IE浏览器重复提交的问题!

浏览 31485 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-06-07  
missxkl 写道
我提醒一下同志们,现在已经严重跑题了。

楼主问的是他的页面刷新的问题,比如提交的时候是到delete.do
如果后台处理后是forward到列表页面list.do,那么用户想
刷新一下列表页面时,实际会再提交一次到delete.do,自然就会
出错了。
struts配置文件里有一项设置,例如:
如果页面要从request.getAttribute()里取数据,设置redirect=fase
<forward contextRelative="true" name="inListIndex" path="/page/assess/inIndexList.jsp" redirect="false" />
如果不需要,设置redirect=true
<forward contextRelative="true" name="delIndex_ok" path="template.do?command=list" redirect="true" />

不知道这是不是楼主想要的?


老兄把我要说的说完了。其它的答案都是没有看清楚楼主的问题瞎说的.
0 请登录后投票
   发表时间:2005-06-08  
我同意missxkl的做法,我觉得同步令牌解决的是两次提交的问题,而且似乎还不大好用。
比如我在上传文件的时候选择使用同步令牌,的确可以解决刷新的问题,但是这个时候按退格键回退,居然告诉我该页面无法显示,再刷新一下之后才能正常显示,显然这对用户来说是非常不友好的。

我目前的做法是先findForward到一个jsp页面,然后再在该页面进行sendRedirect,重定向到listAction,可以圆满解决此问题。
0 请登录后投票
   发表时间:2005-06-09  
利用同步令牌(Token)解决重复提交问题

如果用户对一个html表单多次提交,web应用应该能够判断用户的重复提交行为,并作出相应的处理。

最常见的是新增一条数据,用户已经提交表单并且服务器端已经完成新增成功。此时用户可能有两个误操作:
1.用户通过浏览器的后退功能,返回到录入页面,重复提交(此时浏览器提供回退功能基本上是个邪恶行为)
2.刷新该页面(因为新增成功的提示页面通常是通过请求转发(forward)过来的,所以此操作实际效果通常等同于1)

这样造成的可能结果有:
1.若程序级别和数据库级别限制了重复记录,会提示类似于“xxx字段已存在,请修改后重新保存”的信息
2.若没有此限制,服务器端会再插入一条数据,而这通常不是用户想要的

误操作2和可能结果2的结合就达成了与用户意图相背的结果:服务器端不停地在增加重复记录,用户认为自己只不过是刷新该提示信息页面。

通用的解决思路是:
用户请求录入页面,这个与服务器建立的一次连接过程中,在服务器端①【生成一个session标识,同时返回到客户端一个与此匹配的hidden域】。用户提交了此页面,服务器端首先②【判断此hidden域与session标识是否匹配】,若不匹配,终止保存操作,提示同一表单不能提交两次,同时①【新建一个session标识和hidden域】,返回录入页面;若匹配,执行插入保存操作,同时③【清空(重置reset)session标识】。

Struts正在基于这样的思路在org.apache.struts.action.Action类中提供了内置支持方法:
protected void saveToken(HttpServletRequest request) 配合标签对应于①
protected boolean isTokenValid(HttpServletRequest request) 对应于②
protected void resetToken(HttpServletRequest request) 对应于③

这样我们在写程序的时候,结合Struts的html标签,只要
1.在forward到insert.jsp页面前加一个action执行saveToken(request)操作,或干脆在insert.jsp中写
2.保存前加个判断操作isTokenValid(request)
3.若isTokenValid(request)返回false,执行saveToken(request)操作,返回错误提示页面;true则执行resetToken(request)操作,然后进行实际的保存操作
[size=24][/size]
0 请登录后投票
   发表时间:2005-06-09  
只需在配置文件设置redirect=true;
之后请求的控制权被转向的页面或者action接管刷新页面就不会执行地址栏中的
delaction操作了!
0 请登录后投票
   发表时间:2005-06-10  
同步令牌解决的是同时打开多个客户端浏览器造成的多次提交问题采取sessionId
0 请登录后投票
   发表时间:2005-08-15  
是哦,用REDIRECD直接转向就可以喽。
0 请登录后投票
   发表时间:2005-10-09  
就像ASDF1982说的。只需该配置文件就好了。不过是把redirect=false就好了。
0 请登录后投票
   发表时间:2005-10-27  
dohkoos 写道
missxkl 写道
我提醒一下同志们,现在已经严重跑题了。

楼主问的是他的页面刷新的问题,比如提交的时候是到delete.do
如果后台处理后是forward到列表页面list.do,那么用户想
刷新一下列表页面时,实际会再提交一次到delete.do,自然就会
出错了。
struts配置文件里有一项设置,例如:
如果页面要从request.getAttribute()里取数据,设置redirect=fase
<forward contextRelative="true" name="inListIndex" path="/page/assess/inIndexList.jsp" redirect="false" />
如果不需要,设置redirect=true
<forward contextRelative="true" name="delIndex_ok" path="template.do?command=list" redirect="true" />

不知道这是不是楼主想要的?


老兄把我要说的说完了。其它的答案都是没有看清楚楼主的问题瞎说的.



不错,其实楼住是没有把URL转发和URL重定向2个概念分清楚.missxkl 说的就是解决的办法.
0 请登录后投票
   发表时间:2006-05-16  
在webwork中有令牌的拦截器,这个东西是如何用的呢?有谁能帮忙解释一下。

现在不光是要解决转向的问题,重复提交也是我们大家都遇到的嘛。。谁能给举个例子呀?
0 请登录后投票
   发表时间:2006-08-02  
感觉这个东西还是要看你的需要了啊!内部转向和重定向对于request的影响不小,应该注意一下吧!个人拙见,请大家指教!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics