我有一篇文章的评论表,我会阻止重新提交。我注意到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 no-cache或者必须在缓存控制头中重新验证有关。
无论哪种方式,如果您遇到同样的问题,请在重定向之前检查您发送的其他标头。
答案 0 :(得分:1)
答案 1 :(得分:0)
使用大型随机数向表单添加隐藏字段,或者如果您想要真正疯狂,则附加随机数字的时间戳。
然后将此号码与帖子一起存储,并仔细检查之前是否使用过该号码。如果是这样,请不要重新发布。
这也处理了PRG无法解决的所有情况,即(来自维基):
答案 2 :(得分:0)
这就是为什么我更喜欢使用UUIDs作为我的表行键。对于这样的问题,我会在空白注释字段中生成行键,作为隐藏字段。然后,如果有人试图刷新或击中&提交,INSERT将失败,因为密钥已经存在。