ASP.net中Session和Cookie有什么区别?

40

会话(Session)和 Cookie 有什么区别?

在什么情况下应该使用它们?

8个回答

71

会话

会话以用户为单位在服务器内存(或者其他会话状态)中进行存储。会话使用一个cookie(会话密钥)将用户与会话联系起来。这意味着在用户的机器上不会存储“敏感”的数据。

会话通常用于在浏览网站时维护状态。但是,它们也可以用于保存经常访问的对象。仅当会话状态设置为InProc时,如果设置为另一种会话状态模式,则对象也必须可序列化。

Session["userName"] = "EvilBoy";

if(Session["userName"] != null)
  lblUserName.Text = Session["userName"].ToString();

Cookies

Cookie(Cookies)存储在用户计算机上,每个用户都有自己的Cookie。Cookie通常是一些简单的信息,如用户设置、颜色偏好等。请勿将任何敏感信息存储在Cookie中。

您无法完全信任Cookie未被用户或外部来源篡改,但如果安全性是一个大问题并且您必须使用Cookie,则可以对您的Cookie进行加密,或设置仅通过SSL传输Cookie。用户随时可以清除其Cookie,或者拒绝接受Cookie,因此您不能因为用户曾经访问过您的网站就指望他们仍然存在。

//add a username Cookie
Response.Cookies["userName"].Value = "EvilBoy";
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(10);
//Can Limit a cookie to a certain Domain
Response.Cookies["userName"].Domain = "Stackoverflow.com";

//request a username cookie
if(Request.Cookies["userName"] != null)
   lblUserName.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);

附言

值得一提的是,ASP.NET还支持无cookie的状态管理(cookieless)


1
此外,每个请求都通过 cookie 来识别会话。如果没有 cookie(或 URL 标识符,糟糕!),则无法跟踪会话。 - DGM
回答不错,但我没有点赞,因为他问了一个普遍性的问题,而你的答案需要一些对微软平台的了解。 - TrojanName
1
@Brian 然而...问题标记为 C# 和 asp.net,公平起见 :-) 不过 Cookie 和 Session 是更一般的主题,但所提供的示例适用于 OP,因此我已经点赞了。 - Dan Harris
@DGM我们能聊一下吗?我有一些疑问。 - Suraj Jain
会话和Cookie总是一起出现吗?也就是说,只要有会话/ Cookie,就必须有Cookie /会话吗? - choxsword
对于一个联系表单,对于用户而言,是否真的需要设置 $_SESSION?或者只是使用一些参数,如名称、值、httpOnly,设置一个COOKIE就足够了吗?我不需要用户为此设置密码。 - limakid

23

Cookie 是客户端存储变量的一种方式,它物理上由浏览器存储在客户机上。其范围为整个机器,同一台机器上的不同用户可以读取相同的 cookie。

因此:

  1. 不应将敏感数据存储在 cookie 中。
  2. 不应存储属于一个用户帐户的数据。
  3. Cookie 对服务器资源没有影响。
  4. Cookie 在指定日期到期。

Session 是服务器端存储变量的一种方式,默认情况下,它存储在服务器的内存中。但是,您可以将其配置为存储在 SqlServer 中。它的范围为浏览器级别,同一用户可以运行两个或多个浏览器,每个浏览器都有自己的会话。

因此:

  1. 您可以在会话中保存敏感数据。
  2. 不应该将所有内容都保存在会话中,这样会浪费服务器资源。
  3. 在用户关闭浏览器后,会话超时清除所有信息(默认为20分钟)。

short and sweet :D - AVI

11

Cookie是由服务器(拥有域名)存储在访问该服务器/域名的用户浏览器中的标识字符串。

会话是指在特定时间范围内,某个用户访问服务器/域时可能涉及到的变量、状态和设置的集合。在传统模型中,所有会话信息都存储在服务器上!

由于许多并发用户可以同时访问服务器/域,因此服务器需要能够区分许多不同的并发会话,并始终将正确的会话分配给正确的用户。(而且没有用户可以“窃取”另一个用户的会话)

这是通过cookie实现的。cookie存储在浏览器中,应该是一个随机组合,如s73jsd74df4fdf(因此无法猜测),在每个请求从浏览器发送到服务器时,服务器可以为其答案(页面视图)分配和使用正确的会话。

cookie允许服务器识别浏览器/用户。会话允许服务器在不同的页面视图之间记住信息。


1
我点赞了这个回答,但为什么要设置为社区 wiki?它是一个完全有效的编程相关回答。 - Tamas Czinege

3
会话不依赖于用户允许cookie。相反,它们像令牌一样工作,允许在用户打开浏览器时访问和传递信息。会话的问题在于当您关闭浏览器时,会话也会丢失。因此,如果您有一个需要登录的站点,就不能像cookie一样将其保存为会话,用户每次访问都必须重新登录。

2

可以同时实现以下两种方式:将数据库主键进行哈希并存储在查找表中,然后将哈希值存储为 Cookie 存储在客户端。一旦提交了哈希 Cookie(哈哈哈哈:),就会查找其对应的主键,并将其余详细信息与之关联到服务器数据库的另一个表中。


1
  • Cookie和Session的主要区别在于Cookie存储在用户的浏览器中,而Session则不是。这种差异决定了它们最适合用于什么。

  • Cookie可以在用户的浏览器中保留信息,直到被删除。如果一个人有登录名和密码,这可以设置为他们浏览器中的Cookie,这样他们每次访问您的网站时就不必重新登录。您几乎可以在浏览器Cookie中存储任何内容。


“Cookies 存储在用户的浏览器中,而会话则不是。”那么网页上可用的全局 sessionStorage 对象呢? - Clifford Fajardo

1

会话是服务器端的对象,用于在页面调用之间传输或访问数据。
Cookie 是客户端/客户机上的对象,用于存储浏览器和服务器的某些文本信息。


1

关于会话cookie的概念似乎存在一些混淆。

首先,当我们谈论会话cookie时,它与ASP.Net会话无关。同样,会话cookie与服务器端进程或缓存无关。

会话cookie仅仅是一个在浏览器会话过期时失效的cookie。要创建会话cookie,请不要设置过期日期。这样做将在内存中存储cookie,并在浏览器关闭时被丢弃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接