迷途书童

敏感、勤学、多思
随笔 - 77, 文章 - 4, 评论 - 86, 引用 - 0
数据加载中……

防止任意形式的重复提交

Struts Token 机制可以解决这个问题。

1.   防止通过超链接重复访问 Struts Action

如果我们要防止 A 的默认页面 J 中指向 K 的超链接重复提交数据,按照下列步骤即可:

a.   如果 J 是从 Struts Action 转发而来,我们要在该 Struts Action execute 方法中添加下面的一行:

    saveToken(request);

b.   如果 J 不是从 Struts Action 转发而来,那么新建一个 Struts Action ,在该 Struts Action excute 方法中增加上面的一行,然后再从该 action 转到 J 页面。

c.   J 页面中使用 Struts 标签生成指向 K 的超链接,如:

   <html:link action="/deleteLayoutAction?layoutId=0" transaction="true" >delete</html:link>

   注意红色字体部分。

d.   <html:link> 标签指向的 action excute 方法中加入下面的代码:

   if (!isTokenValid(request)) {

                     return mapping.findForward(" 这种情况下就是重复提交,转到相应的页面 ");

              }

e All Done.

2.   防止通过表单重复提交数据。

a.   如果 J 是从 Struts Action 转发而来,我们要在该 Struts Action execute 方法中添加下面的一行:

    saveToken(request);

b.   如果 J 不是从 Struts Action 转发而来,那么新建一个 Struts Action ,在该 Struts Action excute 方法中增加上面的一行,然后再从该 action 转到 J 页面。

c.   J 页面中表单 Action 属性指向的 Struts action excute 方法中加入下面的代码:

   if (!isTokenValid(request)) {

           saveToken(request);

                     return mapping.findForward(" 这种情况下就是重复提交,转到相应的页面 ");

   saveToken(request);

              }

e All Done.

posted on 2006-05-06 15:54 迷途书童 阅读(1915) 评论(9)  编辑  收藏 所属分类: java应用

评论

# re: 防止任意形式的重复提交  回复  更多评论   

Struts 的 Token 机制可以解决这个问题。

如果没用Struts 怎么办哇 .................. 郁闷。
2006-05-06 17:52 | Web 2.0 技术资源

# re: 防止任意形式的重复提交  回复  更多评论   

可以仿照struts的token机制原理自己实现一下,very easy!
2006-05-06 19:31 | 独孤过客

# re: 防止任意形式的重复提交  回复  更多评论   

我想知道一个事情:
使用了令牌机制之后,如果在同一个客户端打开两个同样的窗口,那么岂不是新的窗口可以提交表单,旧的窗口就无法提交了呢?

如果是这样的话,令牌机制也不是十分完美啊,如果是在论坛里面使用的话,往往会打开若干个窗口,只有最新的一个窗口可以正确提交表单,简直糟糕透了。
2006-05-07 10:54 | Jonney

# re: 防止任意形式的重复提交  回复  更多评论   

其实还有比较难处理的情况:

return mapping.findForward(" 这种情况下就是重复提交,转到相应的页面 ");

在应用中,这个相应的页面可能是动态的.
比如说首次提交是成功的,那么重复提交就应该也到成功页面.
如果首次提交是失败的,那么重复提交就应该也到失败页面.
但是在代码中我们只知道是重复提交,却不知道首次提交的结果.
所以无法决定应该转到什么页面.

当然, 如果技术能够驱动需求, 比如发生重复提交时显示指定的页面.
问题可以解决.但是把技术上的问题暴露给用户,终归不是很友好.
2006-05-09 07:12 | InPractice

# re: 防止任意形式的重复提交  回复  更多评论   

楼上说的有一定的道理,丧失一点友好性总比引起数据不一致要好得多,所谓”鱼与熊掌不能兼得“
2006-05-09 23:09 | 独孤过客

# re: 防止任意形式的重复提交  回复  更多评论   

你们很强啊

我为你们感到骄傲
2006-05-17 00:54 | 梦游客

# 爱我蒙古  回复  更多评论   

bi mongl ges neen heezee ged buu maart!
2006-07-02 05:03 | 蒙古人175866762

# re: 防止任意形式的重复提交  回复  更多评论   

“防止任意形式的重复提交”标题起得真好听,可惜要用Struts 框架,建议该标题为:“利用Struts 框架,防止任意形式的重复提交”
2006-11-23 12:25 | 被蒙骗的人

# re: 防止任意形式的重复提交  回复  更多评论   

使用了令牌机制之后,如果在同一个客户端打开两个同样的窗口,那么岂不是新的窗口可以提交表单,旧的窗口就无法提交了呢?
这个问题确实很闹心。我还没有解决掉。
2007-05-22 08:58 | wts

只有注册用户登录后才能发表评论。


网站导航: