2

使用CakePHP 2.1我有以下代码

public function getForm($id=null){
        $this->loadModel('DynamicFormResponse');
        /**
         *  Check if form exists 
         */
        $this->form_schema= $this->DynamicForm->isValidForm($id);

        if($this->form_schema == false){
            $this->flash("Invalid form", $this->referer(
                    array('controller'=>"pages", 'action' => 'display')
                    ));           
        }
     ...
     ...

我面临的问题是,调用$this->flash()呈现 Flash 页面但也继续执行控制器。

所以除非我做类似的事情

if($this->form_schema == false){
    $this->flash("Invalid form", $this->referer(
        array('controller'=>"pages", 'action' => 'display')
    ));
    return;           
}

控制器不会终止。

_crsf_error调用方法时会出现主要问题

function _csrf_error() {

    $this->flash("csrf Error",  $this->referer(
            array('controller'=>"pages", 'action' => 'display')
    ));
}

由于 flash 方法不重定向它根本不提供 csrf 保护。在方法中使用return;after不起作用。$this->flash()_crsf_error

PS:此处提供完整代码

4

3 回答 3

6

尽管上面的答案很好地解释了 flash() 方法的作用,但对我来说,它并没有完全回答这个问题,而是提供了一个很好的选择。

我个人想使用 flash 方法,所以我不必使用 session 组件,我发现自己也卡在我的 flash 消息上。在 cake 2.x 文档中,它说 flash() 方法的第二个参数是 CakePHP 相对 URL。这意味着以下应该显示一条消息,然后重定向到索引操作。

$this->flash(__("Some message for the user here..."), array("action" => "index"));

我的问题,以及看起来像原始海报的问题,是它向您显示了 Flash 消息,但之后没有进行重定向。

我用我的应用程序彻底测试了这个,罪魁祸首是 core.php 中的调试设置

Configure::write('debug', 0);

必须将调试值设置为“0”才能进行重定向。我不知道为什么会这样,但是当我的调试设置设置为 1 或更高时,我测试了大约 10 次和 10/10,我刚刚收到了 flash 消息。如果我将其设置为 0,则一切正常。这对我来说不是什么大问题,因为生产环境无论如何都应该将此设置设置为 0。

如果其他人对为什么在调试时不会发生重定向有一些见解,请赐教。

希望这可以帮助。

于 2013-03-08T22:11:43.240 回答
5

flash()不重定向,它呈现。它与函数非常相似render(),它将继续执行脚本,与redirect()函数不同。

您只需要相应地组织您的逻辑,以便在它之后不会执行其他行如果您不想这样做。或者,您可以session->setFlash()结合使用重定向。

在处理诸如无效 csrf 令牌之类的严重错误时,我建议抛出异常而不是向攻击者呈现好消息。不过,您可以使用错误处理程序美化异常呈现。

于 2012-03-21T14:24:51.177 回答
1

我也面临同样的问题。将调试模式设置为 0 后,我得到了问题的解决方案。

配置::write('debug', 0);

以及为什么在调试模式 2 下没有发生重定向,主要原因有一个,

在发送重定向标头之前,您的应用程序正在向浏览器输出某些内容。这可能是由任何 . 这将导致“标头已发送”警告,并且浏览器不会重定向。StackOverflow 上有很多关于这种情况的问题,例如: Headers already sent by PHP

于 2013-06-02T13:41:00.717 回答