繁体   English   中英

Cookie与基于会话的Flash消息

[英]Cookie vs. Session based flash message

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

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

干杯!

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

我不明白为什么你不能使用一个在创建之日起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存储来管理闪存消息。

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

你有3个选择:

  1. 会话 :最常用的方法。 它可以在任何客户端计算机上运行,​​但正如您所说,它可能会给某些服务器配置带来问题。
  2. Cookies :一般来说这是一个很好的选择,但用户可能会阻止这种机制。 仅在您的应用程序要求包含Cookie需要时才推荐。
  3. 数据库 :通用解决方案。 问题是它需要访问数据库(缓慢)。 应使用URL(GET方法)传递ID,以便应用程序知道哪个数据库寄存器对应于此访问。

在我的应用程序中,我使用第二种和第三种方法的组合:我测试cookie,如果它们可用,我使用它们。 如果没有,我使用数据库访问,但我总是缓存数据库访问,以便不为每条消息多次查询。

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

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

好处:

  • 没有cookie /会话/数据库/ memcaches等工作:-)
  • 不像cookie那样依赖客户端时钟
  • 没有其他客户端请求可以“窃取”该消息

坏处:

遗憾的是,在Header(“Location ...”)后面的会话并不总是可靠的;

我正在考虑按照建议把它放到GET请求或Hash标签上,你可以使用window.history.pushState使用URL中的javascript在下一页上删除它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM