[英]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并按回来,则会重新提交表单。
显然我想阻止这一点。
用户访问mydomain.com/?p=1填写发布到mydomain.com/wp-comments-post.php的表单然后将302重定向回mydomain.com/?p=1
按下或访问其他页面并按回来不会导致重新提交。
我已经看过WP代码,但我看不出他们是如何管理它的。 显然这是我想要达到的目标。
有没有人对我可能出错的地方有任何想法?
(我只是用Wordpress作为一个例子来证明它是可能的,显然我不是要完全复制WP,这是毫无意义的)
我没有确切地确定它是哪个标头,但我在进行重定向之前发送了额外的标头(我的代码问题,在重定向之前调用一个函数,当我真的应该首先调用重定向)。
在我移动函数并在重定向之前停止发送这些头之后,它工作正常,在返回后没有重新提交。
当然,检查重复项也很重要,但这会阻止浏览器弹出一个表单重新提交请求,这是我想要的。
我发送的标题在哪里:
内容类型上次修改的Etag内容语言缓存控制Pragma到期
我猜这可能与pragma no-cache或者必须在缓存控制头中重新验证有关。
无论哪种方式,如果您遇到同样的问题,请在重定向之前检查您发送的其他标头。
使用大型随机数向表单添加隐藏字段,或者如果您想要真正疯狂,请添加随机数字的时间戳。
然后用帖子存储这个号码,并仔细检查之前是否使用过该号码。 如果是这样,请不要重新发布。
这也处理了PRG无法解决的所有情况,即(来自维基):
这就是为什么我更喜欢使用UUID作为我的表行键。 对于这样的问题,我会在空白注释字段中生成行键,作为隐藏字段。 然后,如果有人试图刷新或点击并提交,INSERT将失败,因为密钥已经存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.