[CakePHP2.x] 使用安全组件时出现问题 [black-holed]

这是开发团队的 Hase。
在 CakePHP 中使用 Security 组件实现登录功能时
遇到了这个神秘的错误
该请求已被搁置。
黑洞?这是什么?
这种情况尤其容易发生在你提交表单后点击浏览器“后退”按钮,然后再提交一次表单的时候。
作为一个完全的新手,我不明白这个错误是什么意思,所以我
决定查一下如何解决它。
允许 POST 和 Ajax
由于表单屏幕上几乎到处都有错误,
我添加了一个 `beforeFilter` 来允许 POST 请求,顺便也允许 Ajax 请求。
app/Controller/AppController.php
public function beforeFilter() { $this->Security->validatePost = false; $this->Security->csrfCheck = false; ... // ~执行一些处理~ }
我再次检查了一遍
,但错误依然存在。于是,
我又开始着手调查。
修复覆盖
AppController.php中允许 POST 和 Ajax 操作
导致 Controller 覆盖了 beforeFilter,
从而导致通信权限被移除。
因此,我修复了导致黑洞错误的控制器。
在 beforefilter 中parent::beforeFilter();。我
app/Controller/UserController.php
public function beforeFilter() { parent::beforeFilter(); // ~一些处理~ }
我以为错误已经消失了,
但当我再次检查时,同样的错误又出现了。
处理黑洞回调
我已经做到这一步了,但是官方网站上有关于如何处理这个问题的说明。
当受到安全组件的限制时,默认情况下会返回 400 错误并将请求视为无效而丢弃。
您可以通过在控制器中将回调函数设置为 `$this->Security->blackHoleCallback` 来更改此行为。
换句话说,表单后,再返回浏览器重新提交,这提交
是一个无效请求,因此
返回了 400 错误,并且发生了黑洞错误。
我应该一开始就查看官方网站的。
因此,我修改了导致黑洞错误的控制器的前置过滤器,具体如下:
public function beforeFilter() { parent::beforeFilter(); $this->Security->blackHoleCallback = 'blackhole'; $this->Security->validatePost = false; $this->Security->csrfCheck = false; // ~ 一些处理 ~ } // 让黑洞通过 public function blackhole($type) { }
黑洞般的错误消失了!!
真是松了一口气。
参考
https://book.cakephp.org/2.0/ja/core-libraries/components/security-component.html
http://www.aipacommander.com/entry/2015/04/27/180000
3
