Cookie与Session
Web应用程序是使用HTTP协议传输数据的。而由于HTTP协议是无状态的协议。因此一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。会话跟踪是Web程序中的常用技术,作用就是跟踪用户整个会话。常用的会话跟踪技术是Cookie和Session。
一、 Cookie简介
1、 Cookie机制可以弥补HTTP协议无状态的不足。由于HTTP是一种无状态的协议,因此服务器单从网络连接是不能够知道客户身份的。所以,Cookie机制就相当于是给客户颁发一个通行证,并且这个通行证是人手一个的。而无论是哪个客户,在访问服务器时都必须携带自己的通行证;这样,服务器就能从通行证上获取客户身份信息了。
2、 Cookie是一种存储在我们这些访问者的计算机中的变量。也就是一种储存在用户本地终端上的数据。而每当我们使用同一台计算机通过浏览器请求某个页面时,就会发送存储在这个计算机本地终端上的 cookie。
3、 Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。
4、 Cookie是由 Web 服务器保存在用户浏览器(客户端)上的一小段的文本信息文件,它包含了有关用户的信息。因此无论何时用户链接到服务器,Web 站点都可以访问到这个Cookie并且获取里面的信息。
5、我们可以使用 JavaScript 来创建和取回 cookie 的值。但是目前有些 Cookie 是临时的,而有些则是持续的。
(1)临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过这个规定的时间,该 Cookie 就会被系统清除掉。
(2)持续的Cookie我们可以通过设置 Cookie 的过期时间为负,强制使 Cookie 过期。
(3)cookie 虽然在持久保存客户端数据上提供了方便,分担了服务器存储的负担,但还是有很多局限性的。
6、Cookie的局限是:
(1)Cookie具有数量和长度的限制。每个特定的域名(domain)下最多生成20个Cookie,并且每个Cookie的长度不能超过4KB,否则会被截掉。而最大的Cookie大约为 4096 字节,为了兼容性,一般不能超过 4095 字节
(2)Cookie的安全性不强。如果Cookie被人恶意拦截的话,那人就可以取得Cookie中所有的session信息。即使我们加密了也于事无补,因为拦截者并不需要知道Cookie的意义,他只需要原样转发Cookie就可以达到他的目的了。
(3)Cookie保存了一些在客户端不可以保存的状态。例如:防止表单重复提交时,我们在服务器端保存的计数器。当我们把这个计数器保存在客户端时,它是不起作用的。因此,我们就需要把它保存到服务器。
7、Cookie的优势是:
(1)Cookie具有极高的扩展性和可用性。
(2)我们可以通过良好的编程来控制保存在Cookie中的Session对象的大小。
(3)我们可以通过加密和安全传输技术【SSL】,降低Cookie被破解的可能性。或者只在Cookie中存放不敏感数据,即使被盗也不会有重大损失。
(5)我们可以通过控制cookie的生命期(有效时间),让它不会永远有效。这样,偷盗者就很可能拿到的是一个过期的cookie。
二、Session简介
1、Session是服务器端使用的一种记录客户端状态的机制。它与Cookie不同的是:Cookie保存在客户端浏览器中,而Session保存在服务器上。简单来说,就是客户端浏览器访问服务器的时候,服务器会把客户端信息以某种形式记录在服务器上。
2、当我们的客户端浏览器再次访问服务器的时候,服务器只需要从该Session中查找该客户的状态就可以了。而不需要客户端再次发送。
3、总的来说,Session就相当于是程序在服务器上建立的一份客户档案。每当有客户来访了,就只需要去这份档案里查找就可以了。就是说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的,而Session机制是通过检查服务器上的“客户明细表”来确认客户身份的。
4、sessionStorage是用于本地存储的一个会话(session)中的数据。
5、sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。因为这些数据(sessionStorage)只有在同一个会话中的页面才能访问,并且当这个会话结束后,数据也会随之销毁。
6、当多个客户端执行程序时,服务器会保存多个客户端的Session。但是获取Session的时候是不需要声明获取谁的Session的。因为Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也是彼此独立,互不可见的。
7、Session的使用虽然比Cookie方便,但是如果在服务器内存中存储过多的Session,会对服务器造成压力。例如:如果Session的内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
8、为了防止内存溢出,服务器会把长时间内没有活跃的Session从内存中删除。这个时间就是Session的超时时间。另外,我们也是可以通过调用Session的invalidate()方法来使Session失效的。
9、我们要知道的是:
(1)Session是在用户第一次访问服务器的时候自动创建的。
(2)但是,如果只是访问静态资源(HTML、IMAGE等)时是不会创建Session的。只有在访问程序(JSP、Servlet等)时才会创建Session。
(3)如果尚未生成Session,那么我们也可以使用request.getSession(true)方法强制生成Session。
(4)Session生成后,只要用户继续进行访问,服务器就会更新该Session的最后访问时间,并维护该Session。注意:每当用户访问服务器一次,无论服务器是否读写了该用户的Session,服务器都认为该用户的Session已经“活跃(active)”了一次。
10、同一台机器的两个浏览器窗口(双击桌面浏览器图标打开的窗口)访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。新开的浏览器窗口会生成新的Session,但子窗口不会生成新的Session而是会共用父窗口的Session。