使用浏览器后退按钮再次触发CakePHP中的Flash消息

时间:2012-04-12 00:23:10

标签: firefox cakephp google-chrome cakephp-2.0

我只是遇到了一个令人费解的情况。我的控制器操作如下所示:

public function myaction($eventId = false) {
    if(!$eventId) {
        //list all events
        $data = foo;
    } else {
        if(!$this->Event->findById($eventId) )
        {
            $this->Session->setFlash('myerror message', 'flash_frontend_message');
            $this->redirect(array('controller' => 'events', 'action' => 'myaction'));
        } else {
            // display event information
            $data = foo;
        }
    }
    $this->set($data);
}

如果我使用在数据库中找不到的$ eventId调用该函数,它将输出一条错误消息,并将用户重定向回所有事件的列表。但是让我说我​​然后选择一个有效的eventId,查看相关信息然后按下浏览器后退按钮,先前的flash消息再次输出,即使这种情况下的URL不包含$ eventId。

我想发生的事情是页面从浏览器缓存加载而不是重新加载。我试图避免将视图存储在缓存中,如下所示:

<!--nocache-->
<?php echo $this->Session->flash(); ?>
<?php echo $this->Session->flash('auth'); ?>
<!--/nocache-->

但仍然会显示flash消息。

知道如何防止这种行为吗? 有没有办法在显示后清除闪光灯?

1 个答案:

答案 0 :(得分:2)

你正在谈论正确的缓存,但试图用错误的缓存修复它。

<!--nocache-->

是php / html文件本身没有缓存语句。它与浏览器缓存无关。 您需要做的是设置正确的标题。

在请求对象中有一个方便的方法来处理这个问题: http://book.cakephp.org/2.0/en/controllers/request-response.html#interacting-with-browser-caching

我通过AppController在所有正常的前端操作中使用它:

public function beforeRender() {
    $this->response->disableCache();
    ...
}