会话(Session)和 Cookie 有什么区别?
在什么情况下应该使用它们?
会话
会话以用户为单位在服务器内存(或者其他会话状态)中进行存储。会话使用一个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)
Cookie 是客户端存储变量的一种方式,它物理上由浏览器存储在客户机上。其范围为整个机器,同一台机器上的不同用户可以读取相同的 cookie。
因此:
Session 是服务器端存储变量的一种方式,默认情况下,它存储在服务器的内存中。但是,您可以将其配置为存储在 SqlServer 中。它的范围为浏览器级别,同一用户可以运行两个或多个浏览器,每个浏览器都有自己的会话。
因此:
Cookie是由服务器(拥有域名)存储在访问该服务器/域名的用户浏览器中的标识字符串。
会话是指在特定时间范围内,某个用户访问服务器/域时可能涉及到的变量、状态和设置的集合。在传统模型中,所有会话信息都存储在服务器上!
由于许多并发用户可以同时访问服务器/域,因此服务器需要能够区分许多不同的并发会话,并始终将正确的会话分配给正确的用户。(而且没有用户可以“窃取”另一个用户的会话)
这是通过cookie实现的。cookie存储在浏览器中,应该是一个随机组合,如s73jsd74df4fdf(因此无法猜测),在每个请求从浏览器发送到服务器时,服务器可以为其答案(页面视图)分配和使用正确的会话。
cookie允许服务器识别浏览器/用户。会话允许服务器在不同的页面视图之间记住信息。
可以同时实现以下两种方式:将数据库主键进行哈希并存储在查找表中,然后将哈希值存储为 Cookie 存储在客户端。一旦提交了哈希 Cookie(哈哈哈哈:),就会查找其对应的主键,并将其余详细信息与之关联到服务器数据库的另一个表中。
Cookie和Session的主要区别在于Cookie存储在用户的浏览器中,而Session则不是。这种差异决定了它们最适合用于什么。
Cookie可以在用户的浏览器中保留信息,直到被删除。如果一个人有登录名和密码,这可以设置为他们浏览器中的Cookie,这样他们每次访问您的网站时就不必重新登录。您几乎可以在浏览器Cookie中存储任何内容。
会话是服务器端的对象,用于在页面调用之间传输或访问数据。
Cookie 是客户端/客户机上的对象,用于存储浏览器和服务器的某些文本信息。
关于会话cookie的概念似乎存在一些混淆。
首先,当我们谈论会话cookie时,它与ASP.Net会话无关。同样,会话cookie与服务器端进程或缓存无关。
会话cookie仅仅是一个在浏览器会话过期时失效的cookie。要创建会话cookie,请不要设置过期日期。这样做将在内存中存储cookie,并在浏览器关闭时被丢弃。
$_SESSION
?或者只是使用一些参数,如名称、值、httpOnly,设置一个COOKIE就足够了吗?我不需要用户为此设置密码。 - limakid