防止评论表重新提交

时间:2010-04-28 16:34:11

标签: php html forms redirect

我有一篇文章的评论表,我会阻止重新提交。我注意到Worpdress很好地处理了这个问题(返回后不会导致浏览器请求重新提交表单),但我无法弄清楚他们是如何做到这一点的,即使我们的方法非常相似。

我的剧本

用户访问mydomain.com/article/1/article_title.html

填写发布到mydomain.com/addnewcomment/1.html

的表单

然后我做了302重定向回mydomain.com/article/1/article_title.html

现在,如果我从这个位置按回来,它就不会请求重定向。但是,如果我去另一个页面,例如mydomain.com/tag/1/my_tag.html并按回来它会重新提交表单。

显然我想阻止这一点。

Wordpress做什么

用户访问mydomain.com/?p=1 填写发布到mydomain.com/wp-comments-post.php的表单 然后,这将302重定向回mydomain.com/?p=1

按回或访问其他页面并按回来不会导致重新提交。

我已经浏览了WP代码,但我看不出他们是如何管理它的。显然,这是我想要实现的目标。

有没有人对我可能出错的地方有任何想法?

(我只是用Wordpress作为一个例子来证明它是可能的,显然我不是要完全复制WP,这是毫无意义的)

编辑 - 弄清楚它是什么

我没有确切地确定它是哪个标头,但我在进行重定向之前发送了额外的标头(我的代码有问题,在重定向之前调用一个函数,当我真的应该首先调用重定向时)。

移动函数并在重定向之前停止发送这些标题后,它运行正常,没有重新提交后返回。

当然,检查重复项也很重要,但这会阻止浏览器弹出一个表单重新提交请求,这是我想要的。

我发送的标题:

内容类型 最后修改 ETAG 内容语言 缓存控制 附注 到期

我猜这可能与pragma no-cache或者必须在缓存控制头中重新验证有关。

无论哪种方式,如果您遇到同样的问题,请在重定向之前检查您发送的其他标头。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

使用大型随机数向表单添加隐藏字段,或者如果您想要真正疯狂,则附加随机数字的时间戳。

然后将此号码与帖子一起存储,并仔细检查之前是否使用过该号码。如果是这样,请不要重新发布。

这也处理了PRG无法解决的所有情况,即(来自维基):

  • 如果网络用户返回网络表单并重新提交。
  • 如果网络用户在加载服务器响应之前多次点击提交按钮
  • 如果网络用户在初始提交完成之前刷新

答案 2 :(得分:0)

这就是为什么我更喜欢使用UUIDs作为我的表行键。对于这样的问题,我会在空白注释字段中生成行键,作为隐藏字段。然后,如果有人试图刷新或击中&提交,INSERT将失败,因为密钥已经存在。