【发布时间】:2011-10-03 16:24:25
【问题描述】:
我想知道HttpContext.Session 是否使用 cookie 来存储数据。一位同事告诉我,在移动站点中,手机通常没有 cookie,因此您没有会话。我一直认为 session 是存储在服务器端的数据,不依赖于客户端对象,如果我错了请解释一下。
我读过this。
【问题讨论】:
标签: asp.net asp.net-mvc-3
我想知道HttpContext.Session 是否使用 cookie 来存储数据。一位同事告诉我,在移动站点中,手机通常没有 cookie,因此您没有会话。我一直认为 session 是存储在服务器端的数据,不依赖于客户端对象,如果我错了请解释一下。
我读过this。
【问题讨论】:
标签: asp.net asp.net-mvc-3
在 ASP.NET 中;你有一个会话 cookie。此 cookie 用于识别 哪个 会话是您的;但实际上并不包含会话信息。
默认情况下,ASP.NET 会将会话信息存储在工作进程 (InProc) 内部的内存中,通常为 w3wp.exe。还有其他存储会话的模式,例如 Out of Proc 和 SQL Server。
ASP.NET 默认使用 cookie;但如果你真的需要,可以配置为“无cookie”;而是将您的会话 ID 存储在 URL 本身中。这通常有几个缺点;例如链接的维护变得困难,人们用过期的会话 ID 为 URL 添加书签(因此您需要处理过期的会话 ID 等)。大多数现代手机,甚至是非智能手机,都支持 cookie。旧手机可能不会。是否需要支持无 cookie 会话取决于您。
如果您的网址如下所示:
http://www.example.com/page.aspx
无 cookie 的 URL 如下所示:
http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/page.aspx
lit3py55t21z5v55vlm25s55 是一个会话 ID。
您可以了解更多关于 ASP.NET 的会话状态here
【讨论】:
会话数据存储在服务器上,但它还在 cookie 中存储了一个 id 字符串以识别用户。
如果不支持cookies,则无法存储id字符串,当用户再次请求时服务器无法配对会话。
会话 ID 只是服务器生成的一个数字(来自计数器或随机),因此它不包含来自您存储在会话对象中的数据的任何信息。
(也可以将应用程序配置为将会话放在 URL 中而不是 cookie 中。这使您可以使用没有 cookie 的会话,但它会破坏您的漂亮 URL。)
【讨论】:
sessionState 文件的sessionState 部分使用cookiless="true"。 msdn.microsoft.com/en-us/library/h6bb9cz9.aspx
现在两者都可以。
服务器端会话已在其他帖子中进行了解释。会话存储在服务器上,但它需要一个 cookie 来存储谁在请求会话值的指示符。
W3C 定义的 WebStorage 新概念展示了现在需要客户端会话的方式。 这是 WebStorage 的 HTML5 实现: https://code.google.com/p/sessionstorage/
【讨论】:
在某些方面这是一个棘手的问题,因为它兼而有之。
会话状态本身存储在服务器上。但是,您需要在客户端上使用某种类型的指标才能使用它。通常,这是一个服务器 cookie,它非常薄,基本上是会话的 GUID,仅此而已。但是,您可以设置站点以在 URI 中传递会话 ID,因此它不必是 cookie。
不确定手机如何处理会话 cookie 概念,但由于我可以登录,并且在 URI 中看不到 ID,因此我假设存在一种机制,即使它不处理用户 cookie。
【讨论】:
会话 ID 默认存储为 cookie。您还可以将会话配置为将其 id 作为查询参数(“cookieless”)传递。
【讨论】: