[英]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.