68

Cache VS Session VS Cookies 有哪些注意事项?

例如:
我经常使用 Session 变量,当用户开始订购产品然后去吃午饭并在几个小时后回来继续预订时,有时会在预订应用程序中出现问题。我将预订存储在会话中,直到用户确认或中止预订,因此当用户只需单击浏览器中的 X 并且永远不会返回时,我不需要与数据库对话并处理数据库中的中途预订。

我应该为此使用缓存或cookies还是某种组合?

(此外,当应用程序出现错误时,会话对象会自行重置,因此我会遇到更多问题)

我主要在做桌面编程,觉得我在这里缺乏很多知识,所以任何可以扩展在哪里使用缓存、会话、Cookie(或数据库)的人将不胜感激

编辑:从答案看来,我想要的是 DB 和 cookie 的组合。

  1. 我必须将预订存储在连接到会话 ID 的数据库中
  2. 将会话 ID 存储在 cookie 中(加密)。
  3. 每个页面都加载检查 cookie 并从数据库中获取预订
  4. 我有一个每周运行一次的清理程序,用于清理未完成的预订。

我不能将预订存储为 cookie,因为用户可以更改价格和其他敏感数据,我必须验证所有内容(不能信任数据)。

我做对了吗?

并感谢你们所有人的精彩解释!

4

8 回答 8

99

从桌面应用程序的角度来看,状态管理是掌握 Web 世界的关键。

  • Session用于在服务器上存储当前 Web 会话的每个用户信息。它支持使用数据库服务器作为后端存储。
  • Cookie应该用于存储当前 Web 会话的每个用户信息或客户端上的持久信息,因此客户端可以控制 cookie 的内容。
  • Cache对象在单个应用程序中的用户之间共享。其主要目的是缓存数据存储中的数据,不应用作主存储。它支持自动失效功能。
  • Application对象在用户之间共享以存储应用程序范围的状态,并且应该相应地使用。

如果您的应用程序被许多未经身份验证的用户使用,我建议您将数据存储在 cookie 中。如果需要身份验证,您可以手动将数据存储在数据库中,也可以使用 ASP.NET 配置文件管理功能。

于 2009-02-16T12:46:25.440 回答
4

Web 本质上是断开连接的模型,并且提到的选项(会话、应用程序、缓存......)都不够可靠。会话将超时,工作进程回收等。

如果您确实需要长时间可靠地存储用户进度,那么数据库是您唯一的解决方案。如果您有用户配置文件(如果用户必须登录),那么这很简单。如果不是,则生成一个唯一 ID,将其存储在 cookie(或 URL)中,并根据该标识跟踪用户。

只需确保 Id 被加密,然后是 base64 编码的字符串,而不仅仅是一个数值。

编辑:

在您对 Mehrdad Afshari 的原始问题和评论进行额外解释之后,对您来说好的解决方案是使用 Session,但将存储设置为 Sql Server 而不是 InProc。

以下是如何设置的更多详细信息和说明:http: //msdn.microsoft.com/en-us/library/ms178586.aspx

请记住,您仍然会遇到会话超时,但它们会在应用程序池回收后仍然存在,甚至服务器重新启动。

如果你真的需要一个永久存储,数据库的自定义解决方案,正如我最初概述的那样,是唯一的解决方案。

于 2009-02-16T12:46:43.663 回答
3

Session 存储在服务器上默认会在 20 分钟内超时(这个是可调的)。我会将其存储在 cookie 或视图状态(如果可用)中以防止超时。

如果您的状态存储在 InProc(默认设置)中,那么在场中拥有多个服务器也会导致您出现问题,除非您实施了某种“粘性会话”,使用户保持在同一台服务器上农场以供后续调用。

我尽量避免会话(在服务器上增加额外的负载和内存使用),并尽可能关闭视图状态以保持页面大小较小。Cookie 通常是最轻量级的选项,但您的用户可能已将其关闭,您将需要一个后备模式,仍然允许他们使用该网站。

编辑(根据提问者的回复添加说明):

Viewstate 存储在隐藏字段中,是 Viewstate 存储中所有对象的序列化表示。Viewstate 自动用于存储页面的状态,但如果您愿意,您可以通过编程方式显式添加和检索您自己的对象到 Viewstate 和从 Viewstate 中检索。

所以是的,数据集可以存储在 Viewstate 中。

于 2009-02-16T12:45:55.303 回答
2

你必须知道的第一件事!cookie 由 session 使用!服务器知道谁是您的用户,这要归功于每次请求在客户端和服务器之间交换的 cookie(这适用于 HTTP 标头 set-cookie 和 cookie)。

真正的问题是:

  • 如果你想在导航过程中存储用户信息,那么你应该使用 session.

  • 如果您的客户端不支持 cookie,那么您可以决定在每个请求中存储一个 cookie,在 URL 中编码(服务器将使用 URL 而不是 cookie 来为请求找到正确的会话)。

然后考虑你想在哪里存储你的会话:
如果你的站点必须具有高disponibility和高性能,那么你不能将会话存储在进程中,而是存储在数据库中。这样,您将能够在多个 Web 服务器之间共享工作。但是您将失去简单性(因为您存储在会话中的对象必须是可序列化的),并且您的网络服务器和数据库服务器之间还有一次往返。

于 2009-02-16T12:55:51.753 回答
1

您不应该使用缓存对象来缓存会话数据,因为缓存在所有用户之间共享。相反,您可以使用 Asp.Net配置文件属性来存储您的数据,或者您可以将事件处理程序添加到 Session_End 事件并在用户离开计算机时间过长时存储数据。

于 2009-02-16T12:49:33.733 回答
1

Cookies以文本文件格式存储在浏览器中。它存储的数据量是有限的。它只允许4kb[4096bytes]。它不保存cookies中的多个变量。

我们可以轻松访问 cookie 值。因此安全性较低setcookie()函数必须出现在标签之前

会话存储在服务器端。它存储无限量的数据。它在会话中保存多个变量。我们无法轻松访问 cookie 值。因此更安全

于 2015-04-01T10:08:07.063 回答
1
  • Cookie是协作软件之间共享的一条信息,通过将特定于客户端的信息存储在客户端的机器上,然后检索以获取状态信息。

  • 选择术语“ cookie ”是因为“ cookie 是一个众所周知的计算机科学术语,用于描述中间人持有的不透明数据”。这里的术语不透明意味着内容只对服务器而不是客户端感兴趣和相关。浏览器将自动将 cookie 包含在其对 cookie 的原始主机的所有后续请求中。cookie 具有名称和值,以及其他属性,例如域和路径、到期日期、版本号和注释。更多_

饼干版本:

Cookie: cookie-name=cookie-value; Comment=text; Domain=domain-name; Path=path-name; Max-Age=seconds; Version=1; Secure
  • 服务器端会话数据可以存储大量数据,而客户端cookie数据的大小有限,从网站发送到服务器,cookie 通常包含参考代码,通过此节省数据传输大小。浏览器关闭后会话立即关闭,但 cookie 存在的时间更长。浏览器将会话 ID 作为 URL 参数、cookie 甚至 HTTP 标头发送到服务器。

  • 缓存是存储数据的硬件或软件组件,因此可以更快地处理未来对该数据的请求;存储在缓存中的数据可能是早期计算的结果,或者是存储在其他地方的数据的副本。

于 2018-04-05T04:55:07.163 回答
1

我总是对LocalStorageSessionStorageCookie感到困惑,但现在不是了。

只需将这些词链接起来,就可以自我解释他们应该做什么。

LocalStorage:本地存储,什么意思,就是你对技术一窍不通的东西,但靠它自己就能猜到。它是一些在本地存储数据的存储。

那是什么。

ITwithout any expiration until user clear it通过 JavaScript 代码或清除浏览器缓存将数据存储在浏览器中。

会话存储:它似乎也存储数据,但与会话相关,那么它与 localStorage 有何不同?

主要区别在于您的session storage data will be deleted once the session is finish or browser tab is closed or the browser is closed.

您可以通过设置在浏览器控制台中尝试

localStorage.setItem('name' , 'alex')
sessionStorage.setItem('session','seesion value')

然后关闭选项卡并再次打开,您仍然可以找到 localStorage 数据但没有 sessionStorage 数据。

Cookie:所以这和上面两个完全不同。通常用于服务器端目的的 cookie。

  • 存储必须与后续请求一起发送回服务器的数据。
  • 它的过期时间因类型而异,过期时间可以从服务器端或客户端(通常从服务器端)设置。
  • Cookies 主要用于服务器端读取(也可以在客户端读取),localStorage 和 sessionStorage 只能在客户端读取。
  • 大小必须小于 4KB。
  • 通过将 cookie 的 httpOnly 标志设置为 true 可以使 cookie 变得安全。这可以防止客户端访问该 cookie
于 2019-08-02T04:01:15.807 回答