session和cookie的区别和联系

session 和cookie的区别和联系

由于http协议是无连接,无状态的,因此服务器是不会保存客户信息的,需要借助cookie和session来完成。

session和cookie的区别

  1. 存储位置不一样,cookie存在浏览器,session存在服务器端。
  2. 存取类型不同,cookie只能存Unicode字符或者二进制数据,需要先进行编码。而session可以存取任何类型的数据。
  3. 有效时间不同,对于非持久性session来说,session只在会话期间有效。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。而cookie有会话cookie和永久cookie之分。
  4. 跨域支持不同,cookie对该域及其子域都是有效的,session只对当前域有效。
  5. 容量大小也不同,cookie的容量最多4KB,session应该是没有限制的。

cookie的产生

首先需要明白的cookie需要在每次请求指定domain域的时候都会携带,所以只有4kB的容量。

cookie是一段很小的文本信息,客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。通过在response中添加响应头setCookie实现,如:Set-Cookie: JsessionID=D356DFFF33AA134DAB; Max-Age=3600; Version=1。
image
客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

当cookie已经产生了,下一次再发送请求的时候,就会根据cookie中的sessionID来查出服务器端对应的session,同时一个session中可以有多个attribute。

session的用法

在java中Session对应的类为javax.servlet.http.HttpSession类。getAttribute(Stringkey)和setAttribute(String key,Objectvalue)。常用的方法还有session.getId

session的存储有效的问题,不是常说session是在会话期间有效吗?那我们关掉浏览器后再次打开淘宝session怎么还存在呢?

情况是这样的。一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用,Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。

session和cookie的联系

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存

其中cookie中的JsessionID对应的value就是在服务器端的session.getId()的返回值。

疑问

如果客户端将cookie删除,那么还能访问到之前对应的session吗?

存了一些用户信息在服务器的session中,一个sessionID就对应一条session记录。将sessionID存入客户端的session当中。那么,当cookie被删除以后,如何才能访问之前的session呢?

参考

http://www.cnblogs.com/linguoguo/p/5106618.html

http://justsee.iteye.com/blog/1570652 很好的一篇文章