[英]Cookie vs. Session based flash message
我在CakePHP中找到的一个简洁的功能是能够设置一个flash
消息,比如在一些save
脚本上,然后在下一页显示该消息。 像Post updated
, Post updated
或Error - 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个选择:
在我的应用程序中,我使用第二种和第三种方法的组合:我测试cookie,如果它们可用,我使用它们。 如果没有,我使用数据库访问,但我总是缓存数据库访问,以便不为每条消息多次查询。
另一个想法是通过url中的哈希传输消息:
if (isset($_POST['submit'])) {
...
header("Location: ".$_SERVER["REQUEST_URI"]."#".urlencode($msg));
...
}
好处:
坏处:
遗憾的是,在Header(“Location ...”)后面的会话并不总是可靠的;
我正在考虑按照建议把它放到GET请求或Hash标签上,你可以使用window.history.pushState使用URL中的javascript在下一页上删除它。
编辑:除非session_write_closed(); 用来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.