2014-01-12 61 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