Php Cookie与基于会话的flash消息
我在CakePHP中发现的一个整洁的特性是能够设置Php Cookie与基于会话的flash消息,php,cakephp,cookies,session-variables,Php,Cakephp,Cookies,Session Variables,我在CakePHP中发现的一个整洁的特性是能够设置flash消息,比如在一些save脚本上,然后在下一页上显示该消息。类似于,后期更新,或错误-找不到文件。 Cake的工作方式是使用此会话对象。我试图避免像瘟疫一样的会话,因为它们对可伸缩性的奇怪要求。我可以不只是简单地将flash消息存储在cookie(客户端)中,然后在下一页显示该cookie后将其删除吗?这种方法的优点/缺点是什么?或者更简单地说,为什么Cake使用会话(我假设这与\u会话集合有关) 干杯 p、 在我的实现中,我还使用jav
flash
消息,比如在一些save
脚本上,然后在下一页上显示该消息。类似于,后期更新
,或错误-找不到文件。
Cake的工作方式是使用此
会话
对象。我试图避免像瘟疫一样的会话,因为它们对可伸缩性的奇怪要求。我可以不只是简单地将flash消息存储在cookie(客户端)中,然后在下一页显示该cookie后将其删除吗?这种方法的优点/缺点是什么?或者更简单地说,为什么Cake使用会话
(我假设这与\u会话
集合有关)
干杯
p、 在我的实现中,我还使用javascript中的
setTimeout
命令使其淡出。我发现这是结束整个过程的好方法。我不明白为什么不能使用从创建日期起10分钟过期的cookie。缺点:如果用户走开,在11分钟后回来,他们可能看不到flash 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
}
或者,如果flash是从客户端单独发起的,您可以使用类似的方法尝试使用localsessionstore来管理flash消息 cookie的问题在于用户可能会禁用此功能。如果是这样,您的flash消息将不会显示。CakePHP尽量做到足够通用,并使用会话存储 您有3种选择:
在我的应用程序中,我使用第二种和第三种方法的组合:我测试cookies,如果它们可用,我就使用它们。如果不是,我使用数据库访问,但我总是缓存数据库访问,以便不对每条消息进行多次查询。另一个想法是通过url中的哈希传输消息:
if (isset($_POST['submit'])) {
...
header("Location: ".$_SERVER["REQUEST_URI"]."#".urlencode($msg));
...
}
优点:
- 在没有cookie/sessions/database/memcaches等的情况下工作:-)
- 不像cookies那样依赖客户端时钟
- 没有其他客户端请求可以“窃取”消息
- 看起来很丑
- 最大安全url长度为2000个字符(请参阅)
- 需要客户端JavaScript来读取和显示哈希值
- 如果已添加书签:每次再次显示消息
编辑:除非会话_write_closed();已使用。“我正试图避免像瘟疫这样的会话,因为它们对可伸缩性的奇怪要求。”。您能详细说明一下吗?是的,当将web服务器水平扩展到服务器场时,您不能保证相同的服务器在相同的请求上被命中-因此它可能正在服务器a上处理,生成会话闪存消息,然后在随后的重定向中显示来自服务器B的页面,该页面不知道其他服务器的会话。对此有一些解决方案,但它们不是IMO的最佳解决方案(即粘性会话等)。@MileMurko大多数HA应用程序实现的特定问题的解决方案是将会话保存处理程序切换为使用数据库或分布式缓存解决方案,如memcache。这使得会话数据可以从任何web头获得。如果你的问题是“哪个更好”,那么你需要详细解释为什么你天生不喜欢一个解决方案而不是另一个。@MileMurko-在为你的平台或应用程序实现DB会话处理程序之前,我真的要测试一下它。我有一个客户端,每月接收120-140亿个HTTP请求,使用db支持的会话并不是冲突的根源,但他们也避免使用_会话来处理ACL和用户标识以外的任何内容,同时通过perma将这些信息缓存到Memcache来减少聊天。如果禁用Cookie,会话真的会工作吗?会话不依赖cookies吗?(如果尚未启用PHPSESSID),那么如何将会话从一个事务持续到下一个事务?会话存储是服务器端的,但会话标识令牌必须提供给客户端,以便客户端在下一次POST/GET调用时返回。正如@David所说,服务器通过在用户的计算机上存储cookie来通过多个请求识别用户。如果用户的计算机上未启用cookie,那么,根本就没有办法实现flash消息。根据植入情况,您还可能面临有人向页面中注入信息并执行类似于domain.com的操作的风险?error=“您需要单击此链接来修复此错误链接。com”