说说实际项目中如何防止重复提交

来源:互联网 发布:python beginwith 编辑:程序博客网 时间:2024/06/04 17:48

http://blog.csdn.net/lsj19830812/article/details/4027812


一般情况下,我们是允许点击浏览器的刷新按钮或者点击页面右键选择刷新的,不然微软做这个功能干啥,但在某些情况下可能这种刷新就会引发不少问题,原因就在于浏览器会缓存客户端最后一次的提交请求,比如我们发布一片帖子,在发布成功页面选择刷新,如果没有做任何处理的情况下,会重复提交一片新的帖子,防止这种问题的方法在我们项目里一般是这样做的

 

1.在进入提交页面时生成一个时间戳,将该时间戳赋值到一个隐藏域中

2.在请求提交到服务器时,服务器获取客户端提交的这个隐藏域time1,并从session中请求session中保存的前一个请求的时间戳time2,如果两个时间戳都不是空并且相等则说明本次请求为重复提交,抛出错误,否则将本次请求的时间戳更新到session的time2中,用于下次做重复提交判断

 

这样的话无论如何刷新页面,浏览器缓存的时间戳域永远是初次进入提交页面时生成的时间戳

这种方式也可以避免在提交页面连续点击按钮提交请求发生重复提交的问题



http://www.pythontab.com/html/2013/pythonweb_1222/636.html

几种防止表单重复提交的方法

  禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。

  我之前的文章曾说过用一些Jquery插件效果不错。

  Post/Redirect/Get模式。在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

  这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

  在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。

  如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。

  这使你的web应用有了更高级的XSRF保护。

  在数据库里添加约束。在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。



http://www.tuicool.com/articles/A3Eneuz

大概有两种方法可以解决:

1.网上根据session给方法结局方案:

            Step 1:首先我们在进入表单填写页面时,对该页面(或view吧)随机生成一个校验字符串并存放于Session中,在页面form中新增一个hidden input来存放,以便提交时一起POST到服务器端;

Step 2:当POST时,服务器端将收到的校验串与Session中对应值比对,若相同则正常提交,否则跳转至指定的错误提示页面;需要注意的是当比对成功后,必须立即将该Session的值设置为空,这样才可保证页面再次POST时表单中的校验串就无法于Session中的空值比对成功。

2.重定向到其他信息页面解决方案

3.重定向到该页面解决。return HttpResponseRedirect('%s'%next),next为上级页面隐藏域中保存的上级页面的url



0 0
原创粉丝点击