两者出现原因?
Cookie和Session出现的原因:由于http 协议是无状态的,服务器无法确定这次请求和上次的请求是否来自同一个客户端。利用session和cookie可以让服务器知道不同的请求是否来自同一个客户端。
定义及工作原理:
Cookie是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器。用户在第一次请求后,由服务器生成Cookie,并封装在响应头中,客户端在接收到响应后存储在客户端;客户端再次发生请求时,请求中会携带Cookie数据,由服务器对会话进行跟踪Cookies保存在客户端,主要内容包括:名字,值,过期时间,路径等等。
分类
会话cookie和持久cookie
会话cookie:不设置过期时间,只要关闭浏览器窗口cookie就消失了。会话cookie不保存在硬盘上,保存在内存里。
持久cookie:设置过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
- 在服务器中系统会为每个会话维护一个Session。不同的会话,对应着不同的Session。那么如何做到在同一会话过程中,一直使用的是同一Session对象?
- 1.写入Session列表
- 服务器对当前应用中的Session是以Map形式进行管理的,这个Map称为Session列表。该Map的key为32位的随机字符串,这个随机字符串称为JSessionID,value则为Session对象的引用。
- 当用户第一次提交请求时,服务端Servlet中执行get.Session(),会自动生产一个Map.Entry对象,key为JSessionID,value则为Session对象的引用。
2.服务器生成并发送Cookie
- 在将Session信息写入Session列表后,系统会自动将"JSESSIONID"作为name,32位的随机串作为value,以Cookie的形式存放到响应报头中,将该Cookie发送到客户端
3.客户端接收并发送Cookie
- 客户端接收到这个Cookie后会将其放置浏览器缓存中。当用户提交第二次请求时,会将缓存中的这个Cookie放在请求的头部发送到服务端
4.在Session列表中查找
服务器会根据请求中的Cookie中的JSESSIONID,从Map中查找对应的value,即Session对象。然后对Session对象的域属性进行读写操作
Cookie和Session的区别
- Cookie 在客户端(浏览器、易伪造、不安全),Session 在服务器端(会消耗服务器资源)。
- Cookie 只能保存ASCII字符串,如果是Unicode字符或者二进制数据需要先进行编码。Cookie中也不能直接存取Java对象。 Session能够存取很多类型的数据,包括String、Integer、List、Map等,Session中也可以保存JJava对象。