Cookie和Session各自特点以及异同点
Cookie
Cookie是服务器通知客户端保存键值对的一种技术,一旦客户端保存了cookie则可以在每次请求的时候都可以发送给服务器
这里有两个比较需要关注的点:
-
从第一句来看,Cookie是由服务器创建的,而后发送给客户端并让客户端保存 由这样的逻辑结构,我们可以用下图比较直观的表现出来:
-
Cookie的数据是键值对的组成形式
这里可以观察一下返回的请求头以及浏览器中的Cookie值,我先创建三个Cookie:
可以看到存在形式为键值对,而且我们可以看到后面的生存周期为session级别,cookie默认创建的生命周期为在关闭浏览器后销毁,即随会话存在,所以为session级别
Cookie的应用
由于Cookie只能存储4kb大小的数据,所以不适合持久存储。由于其每次请求都能自动发送以及本地存储的特性,Cookie常被用来在本地浏览器存储用户名或密码等用户信息,这样可以在登录等操作时起到方便记忆和操作的功能
Session
Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话。
这里需要注意的点是:
- session的创建和获取的API是一致的:
request.getSession()
- Session的超时机制
session和Cookie的生命周期有些不同,Cookie由于是在客户端存储,从而只能作为被调用和提交的键值对,然而session作为会话元素存在,是存在在服务器端的,从而session的超时机制为客户端两次请求的间隔时间。一旦两次间隔过长,则会开启一个全新ID的session,那么之前保存在session中的数据也就不复存在了。同样的,如果两次请求时间在生命周期内,那么相当于从头开始计算生命周期。
Session的应用
最简单的例子:我们在访问一些网站时,登录后的信息就是存在在session中,我们可以在不同的页面看到我们都是在登录状态的,这种效果单凭请求转发和重定向来实现是非常麻烦的,而且还会存在一些表单重传的问题。使用session则完全避免了这些麻烦。
当我们在很长时间不进行操作后,我们点击一些关键页面时发现,网站会提示我们需要登录,这就是session超时后销毁。充分体现了session的特点。
二者关联
Session 技术,底层其实是基于 Cookie 技术来实现的。
为什么这么说呢,之前提到的cookie的生命周期,其中存在的session级别即可保证这样的键值对在会话期间一直存在。而在session中,创建和获取的API一致,恰巧又符合Cookie返回后有则覆盖无则创建的规则。
最关键的是,我们可以先创建一个session,并在返回的请求头中看到如下数据:
我们可以看到请求头中返回的set-Cookie中为一个key为JSESSIONID的Cookie,这就是session的唯一标识ID,也说明了session的底层实现就是cookie的技术
归纳
最后用一张图总结session和cookie的实现关系:
Q.E.D.