2014-01-12 68 views
8

我正在設計一家商店,並在我以前的一些商店中存儲購物車在客戶端(Cookie),但我讀了一本書「使用Rails 4進行敏捷Web開發「,作者設計購物卡在服務器上保存在數據庫中?哪種方法更好?哪些優點和缺點?客戶端vs服務器端購物卡存儲

回答

15

這個問題更多的是關於如何處理會話數據(以安全的方式),而不是如何特別存儲購物車數據。

這兩種方法基本上是:

  • 僅存儲會話中的Cookie ID,並存儲在服務器上的會話信息(在這種情況下,車的內容)。

  • 將會話數據本身存儲在cookie中。服務器可以在處理請求期間讀取這些信息。

有一對夫婦的問題,當您在存儲在客戶端的cookie中的數據:

  • 用戶可以修改的內容。這是一個重要的安全問題。從安全角度來看,您必須假定用戶修改了您存儲的每個字段,因此您必須檢查服務器端的所有內容。例如。當您將產品的價格存儲在您的Cookie中時,您不能認爲該價格實際上是正確的,因爲用戶可能已經更改了它。您必須重新從數據庫中獲取價格。由於很難想象所有可能被篡改的數據都會出錯,這是一個重要的問題。如果你只存儲會話ID,那麼你只需要檢查該ID的有效性(這可能是由你使用的框架完成的)。會話中的所有數據都是可信的,因爲它只存儲服務器端。

  • 餅乾的大小有限(4kB iirc)。例如,如果您將產品說明存儲在cookie中,遲早會遇到麻煩。

  • 數據保留在瀏覽器本地。如果我在工作時在您的網站上購物,請將一些物品放入我的籃子中,然後在我退房時重新打開網站,我的籃子就會變空。

  • 您無法檢查所有客戶在服務器上的給定時間點存在哪些購物車項目。這對於庫存管理可能很重要。通常,您會希望在購物車中爲您的客戶預留一些合理的時間。如果只剩下一本書,並將其放入我的購物車中,則另一位客戶不應在我的會話處於活動狀態時將其放入購物車。如果我的購物車存儲在本地,則無法檢查此消息,因爲當其他客戶將商品放入其中時,我的Cookie不會在服務器上可用。當項目僅存在於客戶端時,您也無法將購物車信息用於統計或分析。

所以,如果你打算做得很好,我肯定會建議將你的購物車存儲在服務器端。另一方面,將它們存儲在客戶機上也有一些優點:

  • 它很簡單,可以快速實施。

  • 服務器上的會話管理可能會變得稍微複雜一點(儘管還有待觀察)。請注意,您並不一定需要自己將會話數據存儲在數據庫中。您的Web應用程序框架可以自動執行此操作,它帶有基本的會話管理。原則上你甚至不需要數據庫(文件或內存存儲應該可用),但由於無論如何你都需要一個數據庫,這可能是不相關的。

  • 將數據存儲在服務器上時,仍然必須發送給客戶端才能顯示它。如果您使用的是JavaScript,則Cookie中的數據已經存在於客戶端上,而如果存儲在服務器上,則必須使用JSON和/或AJAX。

  • 您不必清理舊購物車。當在服務器端存儲購物車時,您會希望它們在一段時間後過期並被移除。再一次,如果您的Web框架管理會話數據,即使您將數據存儲在服務器端,這也不會成爲問題,因爲會話數據將完全失效,並且框架將爲您執行清理。

+0

一些評論: – AndrewW

+0

ahem ... 使用網絡存儲代替cookies來存儲/訪問數據客戶端可以避開cookie的有限存儲大小和傳輸開銷。 但即使您將數據服務器端存儲在會話中,從不同瀏覽器訪問購物車的問題仍將存在。您需要讓用戶以某種方式進行身份驗證/登錄,以便您可以確定它是來自不同瀏覽器的相同用戶。 但問題的好總結。 – AndrewW

2

我認爲這只是簡單的存儲客戶端。在服務器端,您需要將其存儲在數據庫中並從數據庫中獲取,這會在服務器上造成一些不必要的負擔。在客戶端,只需存儲物品的ID及其數量,並在結帳時查看價格並將其彙總在一起。不僅客戶端實現這個更簡單,它也應該更容易在服務器上。

+0

因此,您認爲在服務器上保持購物車絕對沒有意義嗎? –

+0

是的。在你的情況下,我認爲這不切實際。 – mjkaufer

+0

如果你不得不將它存儲在數據庫中,你可以將它存儲在一個會話變量中。 – ziiweb