繁体   English   中英

防止评论表重新提交

[英]Prevent comment form re-submission

我有一篇文章的评论表,我会阻止重新提交。 我注意到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到期

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM