[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的 beforeFilter 中允许 Post 和 Ajax
控制器覆盖了 beforeFilter,导致
通信不再被允许。
在 beforefilter 中添加parent::beforeFilter();来修复导致黑洞错误的控制器
app/Controller/UserController.php
public function beforeFilter() { parent::beforeFilter(); // ~一些处理~ }
我以为错误会消失,所以
又检查了一遍,但同样的错误再次出现。
处理黑洞回调
我已经做到这一步了,但是官方网站上有关于如何处理这个问题的说明。
当受到安全组件的限制时,默认情况下无效请求将被丢弃并返回 400 错误。
您可以通过在控制器中将 `$this->Security->blackHoleCallback` 设置为回调函数来更改此行为。
换句话说,在提交表单后点击浏览器中的“返回”按钮,然后再提交一次,这
是一个无效请求,因此
错误,导致黑洞错误。
我应该一开始就查看官方网站的。
因此,我修改了导致黑洞错误的控制器的前置过滤器,具体如下:
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