前言
Cookie和Session的出现与Http协议的特点有着非常密切的关系,因为Http协议是一个无状态的协议,不能够记录每一次请求和响应数据。例如:在没有Cookie和Session的前提下,你在某宝或某东要下单一本书,由于Http协议是一个无状态的协议,所以它并不能追踪到是谁下单了书,也不能知道它下单了几本书,Cookie和Session的机制就是来标识具体的用户,记录在服务端执行某些操作的状态。
区别
- 存储位置的不同
Cookie数据存储在本地浏览器上,Session数据存储到服务器上
- 存储容量的不同
单个Cookie数据的大小应当 < 4kb,一个站点最多保存20个cookie信息
Session的大小是没有限制的,但为了服务器的性能问题,Session数据也不应该过多,并且session支持删除。
- 存储方式
Cookie的存储方式是以ASCII码表示的字符串
Session的存储方式可以是Java的诸多集合类,例如List,Map…
- 隐私策略
Cookie文件存储的位置在浏览器中,所以对客户端是可见的,但是要防止不怀好意者截图cookie实施cookie欺骗[https://www.cnblogs.com/MR-YY/p/5259178.html]。
Session存储在服务器上,客户端时看不到的,所以相对cookie安全很多。
- 有效期不同
Cookie存在于浏览器的中,可以长期存在于电脑的硬盘里。
Session的内部执行是依赖于值为JSESESSION的cookie,set-cookie = JSESESSION默认值等于-1,也就是说,当浏览器关闭之后,session就消失了,所以session不能达到长期有效的结果。
- 服务器压力不同
cookie数据保存的浏览器,不占用服务器公共资源,对那些并发量很高的网站,是很友好的。
cookie数据保存在服务器,占用了公用资源,对用户并发量较高的网站,每一个用户都会产生一个session对象,如果用户多的话,就会产生很多,很消耗服务器性能。
- 浏览器支持不同
浏览器支持cookie:
那么客户端的cookie既可以设置为本窗口和子窗口有效,还可以设置为所有窗口有效。
服务端的session只能在本窗口和子窗口中有效。
浏览器不支持cookie:
假如浏览器禁用了cookie或本身不支持cookie,则会话跟踪就回失效,服务端发送过来的cookie信息也就接收不到。
但是session其实还是能用,不是说是session的存在是依赖于cookie的吗,cookie都不能用了session还能用吗?
其实是可以的,当服务器创建session对象后,响应给浏览器数据,会给浏览器的响应头的set-cookie=JSESESSION=xxxxx,但是这个时候浏览器已经禁用cookie了,所以浏览器并不能收到它,由于要和服务器通信,要给请求头设置cookie= JSESSION,但是此时浏览器并没有,所以要想实现通信,可以先获取到服务器的JSESSION,再通过浏览器的URL传参的方式传递JSESSION,达到客户端服务器通信。
- 跨域名支持不同
cookie可以跨域访问(setDomain(…))
session不支持跨越访问
参考:https://www.jianshu.com/p/2f7031a69f43