简单总结下 cookie、session

时间:2023-04-07 22:53:05

 

Cookies:

    定义:cookie 中文意思是“小甜饼”,但是,在互联网中它跟食品没有半毛钱关系,它主要是由web服务器应用程序创建,在客户端计算机中保存,问题来了,为什么它web服务器要将创建好的文件保存在客户端?因为客户端发送一个请求到服务端,然后服务器端都是把他当做第一次访问来对待,web 服务器要做的只是简单将对应的响应发送到客户端(浏览器),然后关闭客户端(浏览器)与服务端的连接。这样的缺点就很明显,由于HTTP 协议是无状态的,服务器端不知道同时请求的客户端是那个,也不知道该站点之前已经访问过了该服务器,现在可以根据客户自定义查看。自从网景公司开发了Cookies,可以利用Cookie来保存用户的识别信息。Cookies的作用可以记录了您在该站点上曾经访问过的页面,由此帮助您下次访问该站点时自定义查看。Cookies 也可以存储个人可识别信息。个人可识别信息是可以用来识别或联系您的信息,例如姓名、电子邮件地址、家庭或工作地址,或者电话号码。然而,网站只能访问您提供的个人可识别信息。

    优点:1、实现和使用都是很简单的

              2、对于多个站点的Cookies都是由浏览器进行管理

              3、由浏览器来负责维护Cookies的数据

   缺点:  1、有大小的限制(一般都是4KB)

            2、不安全,都是以简单文本的形式保存

            3、Cookies最大数目也有限制。主流浏览器提供将cookies的个数限制在20条。如果新cookies到来,那么老的将被删除。有些浏览器能支持到300条的cookies数。

创建cookies:

      当一个客户端向服务器发出请求,服务器发送cookies给客户端。而相同的cookies可以被后续的请求使用。例如,如果codeproject.com将Session ID作为cookies存储。当一个客户端首次向web服务器请求页面,服务器生成Session ID,并将其作为cookies发送往客户端。

 现在,所有来自相同客户端的后续请求,它将使用来自cookies的Session ID,就像下面这幅图片展示的那样。

浏览器和web服务器以交换cookies信息来作为响应。对不同的站点,浏览器会维护不同的cookies。如果一个页面需要cookies中的信息,当某个URL被“点击”,首先浏览器将搜索本地系统的cookies的信息,然后才转向服务器来获得信息。

创建cookies 代码:

HttpCookie setCookie = new HttpCookie("code");
setCookie.Name = "code";
setCookie.Value = code;
Response.Cookies.Add(setCookie);

setCookie.Name = "code";

setCookie.Value = code;
Response.Cookies.Add(setCookie);

如何获取cookies 里面的信息:

在读取cookies之前,首先我们需要检查是否能找到该cookie。在读取cookies之前,先检查它总是一个很好的习惯,因为浏览器可能禁用cookies。

HttpCookie getCookie = Request.Cookies["code"];
string cookiesName=string.Empty;
if (getCookie != null)//防止浏览器禁用掉了cookies
{
   cookiesName = setCookie["code"];
}

持久化的cookies:这可以被称为永久性的cookies,它被存储在客户端的硬盘内,直到它们失效。持久化的cookies应该被设置一个失效时间。有时,它们会一直存在直到用户删除它们。持久化的cookies通常被用来为某个系统收集一个用户的标识信息。

非持久化cookies:也可以被称之为临时性的cookies。如果没有定义失效时间,那么cookie将会被存储在浏览器的内存中。我上面展示的例子就是一个非持久的cookies。

修改一个持久化的cookies与一个非持久化的cookies并没有什么不同。它们唯一的区别是——持久化的cookies有一个失效时间的设置。

 

Seesion:

  定义:是保存在服务器iis 上面的一个会话状态,作为一个全局变量,可以作为页面传值,数据类型都是“key-value” 字典类型存储。

  与cookies 联系:当客户端(浏览器)发送请求到服务器端时,服务器端都会判断cookies 里面有没有seesionid ,如果没有,就会创建一个sissionid 与cookies 一起发送到客户端,在cookies 保存在一起,如果有seesionid,则将这个seesionid 与服务端session 池中的sessionid 判断,检查有没有匹配的seesionid ,如果有,直接将对应的cookies 发送到客户端。

session 特性:

1.Session是一种Web会话中的常用状态之一。

2.Session提供了一种把信息保存在服务器内存中的方式。他能储存任何数据类型,包含自定义对象。

3.每个客户端的Seesion是独立存储的。

4.在整个会话过程中,只要SessionID的cookie不丢失,都会保存Session信息的。

5.Session不能跨进程访问,只能由该会话的用户访问。应为提取Session数据的id标识是以Cookie的方式保存到访问者浏览器的缓存里的。

6.当会话终止,或过期时,服务器就清除Session对象。

7.Session常用于保存登录用户的ID.

8.Session保存的数据是跨页面全局型的。

Session原理

session是怎么存储,提取的?

1.在服务器端有一个session池,用来存储每个用户提交session中的数据,Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端,而这个SessionID是一cookie的方式保存的在客户端的内存中的,如果想要得到Session池中的数据,服务器就会根据客户端提交的唯一SessionID标识给出相应的数据返回。

PS:面试常问:如果客户端禁用了cookie,session 还能用吗?

回答:可以,虽然session 与cookies 是通过seesionid 保存到cookies 里面去的,cookies消失,sessionid 也没有了,seesion 就不能检查到客户端用户的访问记录,但是可以通过url 重写的方式进行seesionid  客户端与服务器端进行交互,或者用Cookies Munging (当用户向服务器请求一个页面,服务器编码“session id”然后将它们加入到页面的每一个HREF 的链接中。当用户点击一个链接,asp.net解码session id并传递它给用户请求的页面。现在,正在被请求的页面就可以检索到任何的session变量。这一切都将平滑地发生——当asp.net检测到用户浏览器不支持cookies时)

由于本人经验不足,如果说错的地方,希望大大的指出,不胜感激!!