免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7183 | 回复: 9
打印 上一主题 下一主题

如何防止用户刷新或者后退多次重复提交表单? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-07 21:30 |只看该作者 |倒序浏览
如何用perl cgi 防止用户刷新或者后退多次重复提交表单?

论坛徽章:
0
2 [报告]
发表于 2007-01-07 22:41 |只看该作者
原帖由 jeanny 于 2007-1-7 21:30 发表
如何用perl cgi 防止用户刷新或者后退多次重复提交表单?


如果是基于session的就好作了.session里记录下最后一次post的时间,然后设置一个时间限制,若
当前时间 - 最后一次post的时间 > 时间限制,
则允许post,否则就拒绝了.

论坛徽章:
0
3 [报告]
发表于 2007-01-07 23:03 |只看该作者
2点意见
1 用户为什么会反复post? 多数是因为你的那些需要写数据库(或其他写数据)的操作后,没有重订向页面,而是在当前页面直接输出结果。比如用户登陆后,你直接在login.cgi这个程序里面输出了一些要给用户看的数据,用户想要刷新这些数据,自然就要反复post.如果你做了redirect跳转以后,用户怎么刷新页面,也不会去post。
2 如果是写数据的操作,那么你在后台数据管理逻辑部分防止了数据重复也不怕用户反复post.

如果这些都不是你想要的, 那就只能象楼上所说的记录session了,比如登陆过的用户,不接受新的login请求

论坛徽章:
0
4 [报告]
发表于 2007-01-07 23:17 |只看该作者
1。就算有redirect ,用户也可以看到是哪个程序在处理表单吧?直接到login.cgi后再刷新好了
2。在后台数据管理逻辑部分防止了数据重复。如果数据量很大呢?那递交表单的时候不是要处理很长时间?如果这时用户点击停止又如何处理?
3。用session的话,还有时间限制的。

论坛徽章:
0
5 [报告]
发表于 2007-01-07 23:25 |只看该作者
感觉你的这个需求有点奇怪,个人认为你在钻牛角尖了
首先,你面对的是用户纯心反复post的问题,或许也可以认为是个安全问题
其次,用户post数据,你无论如何也要检查数据是不是重复吧,你的数据量很大,那就牵涉到你用什么引擎管理数据了。
如果还有时效问题,那么我今天post这些数据,明天重新再post同样的数据算不算重复post?

当然可能你是一种特殊的应用,这个我就不得而知了。
也可以考虑一种奇怪的策略,用户post数据之前需要先获得一个token,
数据post完成后。这个token就失效了。他再次post,没有有效的token,你就直接取消这次数据提交

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
6 [报告]
发表于 2007-01-07 23:51 |只看该作者
原帖由 ttvast 于 2007-1-7 23:25 发表
也可以考虑一种奇怪的策略,用户post数据之前需要先获得一个token,
数据post完成后。这个token就失效了。他再次post,没有有效的token,你就直接取消这次数据提交  ...



  这个和session处理类似了。

  例如,论坛,就很需要这样子的处理机制。

论坛徽章:
0
7 [报告]
发表于 2007-01-07 23:55 |只看该作者
原帖由 HonestQiao 于 2007-1-7 23:51 发表



  这个和session处理类似了。

  例如,论坛,就很需要这样子的处理机制。


当然用session很容易实现这样的机制。应该也可以用其他算法来做这样的。
不过关键就是应用的目的把。用redirect方式跳转出去的页面,用户是没有办法通过浏览器的后退来依靠刷新重新post的。因此lz面对的肯定是恶意用户。

论坛徽章:
0
8 [报告]
发表于 2007-01-08 00:01 |只看该作者
原帖由 ttvast 于 2007-1-7 23:55 发表


当然用session很容易实现这样的机制。应该也可以用其他算法来做这样的。
不过关键就是应用的目的把。用redirect方式跳转出去的页面,用户是没有办法通过浏览器的后退来依靠刷新重新post的。因此lz面对的肯定 ...


不要认为任何环境都与你想的相同,不是每个地方都需要redirect的.有的post完后,他确实只需要一个确认页面,就无谓redirect了.

论坛徽章:
0
9 [报告]
发表于 2007-01-08 00:39 |只看该作者
原帖由 兰花仙子 于 2007-1-8 00:01 发表


不要认为任何环境都与你想的相同,不是每个地方都需要redirect的.有的post完后,他确实只需要一个确认页面,就无谓redirect了.

我当然知道有这回事情,我给楼住的建议是所有的地方都加。不是为了你的其他需要而加,仅仅为了防止用户无意中反复post。
我比较不喜欢struts的原因就是,struts让很多人都不用sendRedirect而是sendForward去显示页面,造成用户老是在回退中看到页面已过期的信息

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2007-01-08 16:27 |只看该作者
我的作法..db的table加个 unique field..
在网页中产生这个key的值..保证独一无二...
当有重复POST产生的时候..DB就不会让我insert进去......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP