Cookie与基于会话的Flash消息

时间:2011-05-16 18:11:24

标签: php cakephp cookies session-variables

我在CakePHP中找到的一个简洁的功能是能够设置flash消息,比如在一些save脚本上,然后在下一页显示该消息。类似于Post updatedError - no file found.

Cake执行此操作的方式是使用此session对象。我试图避免像瘟疫这样的会议,因为他们对可扩展性的要求很高。我是否可以简单地将Flash消息存储在cookie(客户端)中,然后在下一页显示后删除该cookie?这种方法的优点/缺点是什么 - 或者更简单地说,为什么Cake使用session(我假设它与_SESSION集合相关)。

干杯!

P.S。在我的实现中,我还使用javascript中的setTimeout命令淡出。我发现这是结束整个过程的好方法。

4 个答案:

答案 0 :(得分:4)

我不明白为什么你不能使用一个过期时间为创建日期10分钟的cookie。如果用户离开并在11分钟后返回,则可能无法看到闪存cookie消息......但您不必担心会使用cookie充斥客户端。

只需制作一些简单的内容规则,以确保没有特权信息放入Flash消息中,您应该做得很好。

一个简单的实现可能是程序性的:

function setFlash($id ,$message){
   setcookie("flash_{$id}", $message, time() + 60 * 10);
}


function getFlashes(){
   $flashes = array();
   foreach($_COOKIE as $id => $value){
        if(strpos($id, "flash_") === 0){
             $flashes[$id] = $value;
             //clear flash and set expiration to 10 minutes in past
             setcookie($id, "", time() * 60 * -10);

         }
  }
  return $flashes;
   //Input cleansing not included for brevity/clarity
}

或者,如果闪存源自客户端,则可以使用https://github.com/marcuswestin/store.js之类的东西来尝试使用localSession存储来管理闪存消息。

答案 1 :(得分:4)

Cookie的问题在于用户可能会禁用此功能。如果是这样,您的Flash消息将不会显示。 CakePHP尝试足够通用并使用会话存储。

您有3个选项:

  1. 会话:最常用的方法。它可以在任何客户端计算机上运行,​​但正如您所说,它可能会给某些服务器配置带来问题。
  2. Cookie :这是一个很好的选择,但用户可能会阻止此机制。仅在您的应用程序要求包含cookie的需要时才推荐。
  3. 数据库:通用解决方案。问题是它需要访问数据库(缓慢)。应使用URL(GET方法)传递ID,以便应用程序知道哪个数据库寄存器对应于此访问。
  4. 在我的应用程序中,我使用了第二种和第三种方法的组合:我测试了cookie,如果它们可用,我会使用它们。如果没有,我使用数据库访问,但我总是缓存数据库访问,以便不为每条消息多次查询。

答案 2 :(得分:0)

另一个想法是通过url中的哈希传输消息:

if (isset($_POST['submit'])) {
    ...
    header("Location: ".$_SERVER["REQUEST_URI"]."#".urlencode($msg));
    ...
}

优点:

  • 没有cookies / sessions / databases / memcaches等工作: - )
  • 不像cookie那样依赖客户端时钟
  • 没有其他客户请求可以“窃取”消息

缺点:

答案 3 :(得分:0)

不幸的是,会话后跟Header(“ Location ...”);并不总是可靠的

我正在考虑按照建议将其放入GET request或Hash标签,并且可以使用window.history.pushState从URL使用javascript将其擦除在下一页。

编辑:除非session_write_closed();使用。