【发布时间】:2011-10-15 17:10:22
【问题描述】:
当用户登录我的网站时,我会将 HttpContext.Current.SessionID 存储在我的用户日志表中。我想确保这可以重复吗?如果是,我想让该列在数据库中唯一。如果可以复制,那么从会话中获得的任何东西都是独一无二的,并且将来永远不会像 GUID 那样重新生成?
【问题讨论】:
当用户登录我的网站时,我会将 HttpContext.Current.SessionID 存储在我的用户日志表中。我想确保这可以重复吗?如果是,我想让该列在数据库中唯一。如果可以复制,那么从会话中获得的任何东西都是独一无二的,并且将来永远不会像 GUID 那样重新生成?
【问题讨论】:
HttpContext.Current.SessionID 对于当前的会话集是唯一的 - 也就是说,每个会话 ID 在其处于活动状态时都是唯一的。但是,一旦会话过期,就无法保证新会话不会具有相同的 ID。如果是这种情况,任何持久性数据(基于会话 ID)现在都将引用不同的会话。
还请注意MSDN page的以下备注。
SessionID 值由 ASP.NET 随机生成并存储在一个 浏览器中的非过期会话 cookie。 SessionID 值为 然后在 cookie 中随每个请求发送到 ASP.NET 应用程序。
但是,如果 cookie 被清除,会话将重新启动。
SessionID 在服务器和浏览器之间以明文形式发送 cookie 或 URL 中的文本。结果,一个不需要的 源可以通过获取访问另一个用户的会话 SessionID 值并将其包含在对服务器的请求中。如果你 在会话状态中存储私人或敏感信息,它是 建议您使用 SSL 加密 包含 SessionID 的浏览器和服务器。
【讨论】:
为什么不将 userid 和 sessionid 设为复合主键?或者 sessionid 和 datetime。这将使其不可能或几乎不可能被复制。
【讨论】:
SessionID 不是唯一的。
它在创建时是唯一的,但不能保证在一段时间内是唯一的。例如,如果重新启动 IIS,它可能会重新启动编号序列。
在这种情况下,制作复合主键或使用 uniqueidentifier 就足够了。
http://weblogs.asp.net/bsimser/archive/2004/09/13/228713.aspx
【讨论】: