簡體   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