锁定老帖子 主题:IE浏览器重复提交的问题!
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-08-29
我曾经想尝试Webwork的同步令牌控制,但发现居然还要受ww2的UI Tag的限制,也就是说还要用一个<ww:token/>,而WW2的UI Tag居然是基于Velocity的,晕。
即使没有这些问题,WW2的Token的控制也是有问题的,是针对Action(既单个类),而不是针对Command,也就是说执行页面与输入页面要强制分离,理论是应该这样,但是我觉得很不灵活,因为它要让我完全放弃WW灵活command的机制。 最后还是用我上面提到的方法,暂时这样解决。 |
|
返回顶楼 | |
发表时间:2004-08-30
今天TSS有篇文章和这问题有点关系:
http://www.theserverside.com/articles/article.tss?l=RedirectAfterGet |
|
返回顶楼 | |
发表时间:2004-08-31
根本的解决办法还是用token。
能解决你的问题,包括回退刷新 |
|
返回顶楼 | |
发表时间:2004-08-31
downpour 写道 另外,不清楚楼下说的在服务器转向是什么意思? 就是调用servletContext.getRequestDispatcher("target servlet").forward(request,response),实际上是把请求交给target servlet处理,此时浏览器还没有收到服务器的响应。 而如果是用request.sendRedirect("target servlet")的话,就是给浏览器一个响应,在返回的http协议头中包含了target servlet的地址,浏览器就知道,它要给这个target servlet发出请求。 下面是针对redirect做的一个试验 redirect.jsp转向到一个已有的文件 <%! int pageCount = 0; void addCount(); { pageCount++; } %> <html> <head> <title>PageCounter.jsp</title> </head> <body> <% addCount();; %> This page has been visited <%= pageCount %> times. <% session.setAttribute("pageCount",pageCount+"");; %> </body> </html> <%response.sendRedirect("target.jsp");;%> target.jsp转向的目标文件,显示redirect.jsp页面被请求的次数 The redirect page has been visited <%= session.getAttribute("pageCount"); %> times. 访问http://localhost/redirect.jsp,则显示页面内容为target.jsp,并且无论如何刷新,次数总是为1。下面是通过telnet察看请求redirect.jsp得到的响应,可以看出返回的状态码是302,表示重定向,而location就是目标jsp文件的地址。 telnet localhost 80 GET /redirect.jsp HTTP/1.0 HTTP/1.1 302 Moved Temporarily Set-Cookie: JSESSIONID=CD608AEF708A23C7B7409F9A46ACE735; Path=/ Location: http://127.0.0.1/target.jsp Content-Type: text/html Content-Length: 0 Date: Tue, 31 Aug 2004 09:49:54 GMT Server: Apache-Coyote/1.1 Connection: close |
|
返回顶楼 | |
发表时间:2004-09-20
这个在struts中有token的处理方法
简单例子如下: if (isTokenValid(request, true)) { //你的处理程序 } //创建一个新的同步令牌 saveToken(request); 以下是网上抄来的一段简单说明: 基本原理: 服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。 在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。 这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。 |
|
返回顶楼 | |
发表时间:2004-09-21
主要是自己做令牌太麻烦了,如果针对没每个可能的操作页面都要做,那就太繁琐了,也容易出错。这就好像transaction或jdbc connection那样,最好能由框架或者aop解决,来个declarative service.
|
|
返回顶楼 | |
发表时间:2004-09-22
我觉得并不是每个页面都需要做令牌控制吧!
例如,一个列表页面,然后点击新增,弹出一个窗口并行新增操作, 提交之后,这个窗口就关闭了,这样的操作根本就不需要做什么令牌控制,因为页面本身都关闭了,也就不存在重复提交的问题。 一般只有删除的操作才做令牌控制! 不知道楼上的,你的应用是怎么样的情况? ![]() |
|
返回顶楼 | |
发表时间:2004-12-29
w_weidong 写道 我觉得并不是每个页面都需要做令牌控制吧!
例如,一个列表页面,然后点击新增,弹出一个窗口并行新增操作, 提交之后,这个窗口就关闭了,这样的操作根本就不需要做什么令牌控制,因为页面本身都关闭了,也就不存在重复提交的问题。 一般只有删除的操作才做令牌控制! 不知道楼上的,你的应用是怎么样的情况? ![]() 有时候是在点击 提交时.由于速度很慢,中间页还没跳过,这时用户.按了一下刷新. 这样也会有两条记录............. 我在用struts.............. 就是有时候有那个保存令牌的隐藏域,有时候打开又没有.但要刷新一下,才能跑了出来. <form name="questionForm" method="POST" action="/bbs/questionAction.do"> <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="c8b26fe7aab8846c5c53dc6eb40bb613"> 上面就是在前面jsp页面上会自动生成的. 怎么回事. --------------------- 我是先全局地址转向.在prepareinsert里saveToken(request); <global-forwards> <forward name="questionAction" path="/prepareinsert.do"/> </global-forwards> 然后再在questionAction里isTokenValid(request)做个判断. 但不知为什么.第一次提交时(在第一次打开该页,好像没有执行save动作).都没有那个隐藏域.都要在这个页刷新一下. 那个隐藏域才会出来.. 怎么回事..... |
|
返回顶楼 | |
发表时间:2004-12-30
我提醒一下同志们,现在已经严重跑题了。
楼主问的是他的页面刷新的问题,比如提交的时候是到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" /> 不知道这是不是楼主想要的? |
|
返回顶楼 | |
发表时间:2005-06-07
没看明白,麻烦能解释一下吗,谢谢!
lllyq 写道 看来你是用Webwork的,你可以这样做
<result name="success" type="redirect">article!input.action</result> <result name="input" type="dispatcher">article.jsp</result> 当然,前提是在一个相对比较靠根(ActionSupport)的位置实现 public String input(); { return "input"; } |
|
返回顶楼 | |