cookie通过扩展http的协议,将需要传达的信息设置在http协议的头信息里,包括名称值对、日期、路径和域,路径和域组成cookie的作用范围,由客户端在后台按照按照一定的规则发送到服务器。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。cookie信息保存在客户端中。
session提供了跟踪客户端信息的一种机制,session信息保存在服务器中。当某个客户端请求创建一个session时,服务器首先检查客户端的信息中是否含有session标识(session id),如果存在,则证明已经为该客户端创建过session,服务器按照session id检索出已创建的session进行使用。如果不存在,则为该客户端创建session且生成一个唯一的新的session id作为标识。保存这个session id可以用cookie,在cookie被禁止的时候可以用一种叫做“url重写”的技术,即在url后加上sessionid。
cookie和session的不同:
1、存取数据类型不同
cookie只能保存askii字符串,如果要保存unicode字符或二进制数据,首先进行编码。
//对中文编码解码
String str = java.net.URLEncoder.encode("中文","UTF-8"); //编码
String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8"); // 解码
session则可以保存任何类型的数据,可以把session看作一个容器类。
2、隐私策略不同
cookie保存在客户端中,对客户端是可见的;session则保存在服务器中,对客户端是不可见的。
3、信息储存的有效期不同
cookie可以实现长期保存;session的存储时间依赖于名为JSESSIONID的cookie,过期时间默认为-1,因此关闭客户端浏览器之后该session就会失效,而且,设置session的时间越长,服务器储存的session信息越多,越容易造成内存溢出。
4、服务器压力不同
cookie保存在客户端,不占用服务器资源,像是Google、baidu等并发访问量过大的网站都是用cookie保存用户信息;session保存在服务器,保存session信息越多,压力越大。
5、浏览器支持不同
假如客户端支持Cookie,则Cookie既能够设为本浏览器窗口以及子窗口内有效(把过期时间设为–1),也能够设为一切阅读器窗口内有效(把过期时间设为某个大于0的整数)。但Session只能在本阅读器窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session。
6、应用场景不同
cookie用于跟踪回话,也可用于保存用户账户密码、喜好设置等;
session用于跟踪回话。
实际应用中,往往将二者搭配使用。