2008-09-18 73 views
15

您正在構建一個Web應用程序。您需要在用戶會話期間存儲購物車的狀態,如對象。網絡開發 - 在哪裏存儲購物車狀對象的狀態?

一些注意事項:

  • 這不完全是一個購物車,而更像是一個行程,用戶正在建設中...但是我們會用這個詞車現在B/C PPL涉及到它。
  • 你不關心「放棄」的購物車
  • 一旦購物車完成,我們會將其持久存儲到某些服務器端數據存儲中以供日後檢索。

其中是否存儲該有狀態對象?和如何

  • 服務器(會話,DB等?)
  • 客戶端(餅乾鍵丘壑,餅乾JSON對象,隱藏的表單字段,等等?)
  • 其他...

更新:有人建議我列出我們的目標平臺 - 我不確定它的完全必要...但可以說前端是用ASP.NET MVC構建的。

回答

1

在DB綁無論你正在使用的會話(DB /內存緩存會議,簽署了餅乾),或經過認證的用戶。

+0

甚至可能沒有數據庫(至少不是關係數據庫)...:) – stevenharman 2008-09-18 19:53:04

+0

將它存儲在你的「服務器端」數據存儲:)。爲什麼有2個不同的數據存儲?存儲服務器端增加了更多的靈活性和安全性。 – 2008-09-18 19:59:46

1

將其存儲在數據庫中。

0

如果您關心支持未啓用Javascript的用戶,那麼服務器端會話將允許您使用URL重寫。

1

不知道平臺我不能直接給出答案。但是,由於您不關心被遺棄的購物車,所以我會在這裏與我的同事不同,並建議將其存儲在客戶端。如果你不在乎它是否被放棄,爲什麼要將它存儲在數據庫中?
然後再次,它取決於您要存儲的對象的大小 - cookies完全有其限制。

編輯:啊,asp.net MVC?爲什麼不使用配置文件系統?你可以啓用匿名配置文件,如果你不想打擾讓他們登錄

1

你是否設想人們需要能夠啓動一臺機器(例如他們的工作電腦),但從另一臺機器繼續/ finsih(比如家用電腦)?如果是這樣,答案是顯而易見的。

+0

這不是我們計劃支持匿名用戶的場景 - 我們可能會爲經過驗證的用戶提供支持。 – stevenharman 2008-09-18 19:52:24

1

如果你不關心廢棄車,並有到位的事情的人,而客戶端的數據搞亂......我想一個cookie將是一件好事 - 尤其是如果它只是JSON數據的cookie。

+0

Cookies僅限於4K。這可能不夠數據,這取決於購物車的大小。 – 64BitBob 2008-09-18 19:59:15

+0

是的,我同意它真的取決於應用程序的要求,以確定這是否是最佳路線。 – 2008-09-18 20:03:03

0

如果相對較短的超時(約2小時,具體取決於您的服務器配置)是車好,那麼我想說的服務器端會話。它比訪問數據庫更快,更高效。

如果你需要一個較長的持久性(比如一些用戶不想離開,第二天回來),然後將其存儲在cookie中是防篡改(使用加密或哈希)。

2

我傾向於將它作爲會話對象存儲。這是因爲你不關心被遺棄的購物車,因此可以省去將其存儲在數據庫中的開銷,因爲它不是必需的(更不用說,您還需要某種清理例程來從數據庫中移除已放棄的購物車)。

但是,如果您希望用戶能夠堅持購物車,那麼數據庫選項會更好。這樣,登錄的用戶將在會話中保存購物車(因此當他們回到網站並登錄時,他們的購物車將被恢復)。

你也可以使用這兩者的組合。來到該網站的用戶默認使用基於會話的購物車。當他們登錄時,所有項目都從基於會話的購物車移動到基於數據庫的購物車,並且任何後續購物車活動都直接應用到數據庫。

1

我會在客戶端使用(加密的)cookie來保存用戶籃子的ID。除非這是一個非常繁忙的網站,否則放棄的籃子不會填滿太多,並且您可以運行常規管理任務以清除放棄的訂單,如果您非常關心。同樣這樣做的用戶將保持他們的訂單,如果他們關閉瀏覽器並離開,會話中的籃子將被清除在這一點上。

最後這意味着你不必擔心寫作代碼來處理來自客戶端cookie的數據的de /序列化,而後來又擔心在將數據轉換成訂單時實際將數據放入數據庫中(我喜歡的故障點太多)。

1

我會說存儲服務器上的某個地方的狀態,並將其關聯到用戶的會話。雖然cookie在表面上可能是存儲事物的平等位置,但如果考慮安全性和數據大小,儘可能多地在服務器上保留數據會成爲一件好事。

例如,在公共終端設置中,有人查看cookie的內容並查看列表是否可以?如果是這樣,餅乾很好;如果沒有,您只需要一個將用戶鏈接到數據的ID。這樣做還可以確保用戶通過網站身份驗證以獲取該數據,而不是將所有內容存儲在計算機上 - 他們需要某種形式的憑證以及會話標識符。

從尺寸的角度來看,當然,你不會過於擔心4K cookie或瀏覽器/寬帶用戶的東西,但如果你的目標之一是允許手機或黑莓(不是3G)連接起來並擁有精彩的體驗(而不是爲數據收取費用),最大限度地減少傳遞給客戶端的數據量是關鍵。

服務器存儲還爲您提供了一些其他答案中提到的一些靈活性 - 用戶可以將他們的購物車保存在一臺計算機上並在另一臺計算機上恢復工作;您可以將購物車綁定到某種形式的憑證(而不是暫時會話),並在用戶清除cookie後長時間保持購物車的狀態;您可以通過容錯的方式獲得更多信息 - 如果用戶的瀏覽器崩潰,該站點仍然具有安全可靠的數據。

如果容錯很重要,則需要某種類型的持久性存儲,如數據庫。如果沒有,應用程序內存可能沒問題,但如果應用程序重新啓動,則會丟失數據。如果您處於農場環境中,則該商店必須集中訪問,因此您再次查看數據庫。

您是否選擇通過臨時會話或通過憑證輸入密鑰將取決於用戶是否可以保存其數據並稍後返回以獲取該數據。瞬時會話最終會被清理爲「廢棄」,也許沒問題。綁定到用戶配置文件將讓用戶保留他們的數據並明確放棄它。無論哪種方式,我都會利用某種支持存儲,如數據庫來提供容錯和中央可訪問性。 (或者,也許我是過度工程的解決方案?)

3

我已經考慮過你的建議,但還沒有一個客戶端項目尚未嘗試。最近的其實是,你可以在這裏找到一個購物清單...

http://www.scottcommonsense.com/toolbox.aspx

點擊雜貨店清單打開窗口。它使用ASPX,但僅用於管理放置在頁面上的JS引用。其餘部分通過使用Web服務的AJAX完成。

以前我爲自動使用anon/auth cookies的商業網站構建了ASP.NET 2.0網站。每個都爲您提供了一個GUID值,您可以使用該值來標識與數據庫中的數據關聯的用戶。我想要驗證cookie,以便用戶可以移動到不同的計算機;工作,家庭等。我避免使用Profile字段來保存複雜的ShoppingBasket對象,該對象在所有ASP.NET 2.0書籍中都很受歡迎。隨着時間的推移數據結構發生變化,我不想處理「神奇」的序列化問題。我更願意使用與軟件更改同步的更新/更改腳本來管理數據庫模式更改。

通過anon/auth cookie標識客戶端上的用戶,您可以使用ASP.NET AJAX客戶端使用作爲ASP.NET一部分提供給您的JS代理來調用認證Web服務。您需要實現Membership API以至少驗證用戶身份。其餘的提供者實現可以安全地拋出一個NotImplementedException。然後,您可以通過AJAX使用您自己的自定義ASMX Web服務(請參閱ScriptReference屬性),並使用服務器端數據更新頁面。你可以完全拋棄ASPX頁面,只需要使用靜態HTML/CSS/JS。

一個很大的警告是JS中的內存泄漏。長時間保持同一頁面會增加潛在的內存泄漏問題。您可以通過測試長時間會話並使用Firebug和其他工具查找內存泄漏來降低風險。使用JS Lint工具以及它將幫助您確定主要問題。

23

這是我與Commerce Starter Kit和MVC Storefront(以及我創建的其他站點)的經驗,無論您現在認爲什麼,關於用戶與您的「產品」交互的信息對於業務人員都至關重要。有很多指標需要捕捉 - 這是堅果。

我會爲你保存所有我已經經歷的東西 - 迄今爲止,對我來說最成功的是創建一個具有「NotCheckedOut」狀態的Order對象,然後向它添加項目並且用戶添加項目。這可讓用戶擁有多個購物車,並允許您從訂單表中挖掘焦油。處理訂單也很容易 - 只需更改狀態即可。

由於某種原因,持續「隨時走動」還允許用戶返回並完成送貨。寬恕與電子商務是巨大的。

餅乾吸盤,會話吸盤,配置文件附加到用戶的概念,它擊中數據庫,所以你不妨使用數據庫。

你可能認爲你不想這樣做 - 但你需要信任我,知道你會確實需要一些數據後喂統計書呆子。我答應你。