Cookie和Session各自特点以及异同点

Cookie是服务器通知客户端保存键值对的一种技术,一旦客户端保存了cookie则可以在每次请求的时候都可以发送给服务器

这里有两个比较需要关注的点:

  1. 从第一句来看,Cookie是由服务器创建的,而后发送给客户端并让客户端保存 由这样的逻辑结构,我们可以用下图比较直观的表现出来:
    image.png

  2. Cookie的数据是键值对的组成形式
    这里可以观察一下返回的请求头以及浏览器中的Cookie值,我先创建三个Cookie:
    image.png
    可以看到存在形式为键值对,而且我们可以看到后面的生存周期为session级别,cookie默认创建的生命周期为在关闭浏览器后销毁,即随会话存在,所以为session级别

Cookie的应用

由于Cookie只能存储4kb大小的数据,所以不适合持久存储。由于其每次请求都能自动发送以及本地存储的特性,Cookie常被用来在本地浏览器存储用户名或密码等用户信息,这样可以在登录等操作时起到方便记忆和操作的功能

Session

Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话。

这里需要注意的点是:

  1. session的创建和获取的API是一致的:

request.getSession()

  1. Session的超时机制
    session和Cookie的生命周期有些不同,Cookie由于是在客户端存储,从而只能作为被调用和提交的键值对,然而session作为会话元素存在,是存在在服务器端的,从而session的超时机制为客户端两次请求的间隔时间。一旦两次间隔过长,则会开启一个全新ID的session,那么之前保存在session中的数据也就不复存在了。同样的,如果两次请求时间在生命周期内,那么相当于从头开始计算生命周期。

Session的应用

最简单的例子:我们在访问一些网站时,登录后的信息就是存在在session中,我们可以在不同的页面看到我们都是在登录状态的,这种效果单凭请求转发和重定向来实现是非常麻烦的,而且还会存在一些表单重传的问题。使用session则完全避免了这些麻烦。
当我们在很长时间不进行操作后,我们点击一些关键页面时发现,网站会提示我们需要登录,这就是session超时后销毁。充分体现了session的特点。

二者关联

Session 技术,底层其实是基于 Cookie 技术来实现的。

为什么这么说呢,之前提到的cookie的生命周期,其中存在的session级别即可保证这样的键值对在会话期间一直存在。而在session中,创建和获取的API一致,恰巧又符合Cookie返回后有则覆盖无则创建的规则。
最关键的是,我们可以先创建一个session,并在返回的请求头中看到如下数据:

image.png
我们可以看到请求头中返回的set-Cookie中为一个key为JSESSIONID的Cookie,这就是session的唯一标识ID,也说明了session的底层实现就是cookie的技术

归纳

最后用一张图总结session和cookie的实现关系:

image.png

Q.E.D.


二八笙歌云幕下,三千世界雪花中