cookie和session的联系

1. cookie

1.1 简介

       cookie主要是客户端(浏览器)进行数据存储的一种形式。当浏览器在发起请求的时候(不考虑跨域),会自动携带关联的cookie信息到后端。cookie前后端都可以进行设置。
       后端cookie的设置主要是在响应头中设置set-cookie字段,并设置cookie相关的属性项信息,浏览器在读取到响应头中的set-cookie时,会自动将信息保存到cookie中。
cookie和session的联系
       后端设置代码如下:
cookie和session的联系

1.2 cookie属性项

name: Cookie的名称
value: Cookie的值
maxAge: Cookie的失效时间,单位秒。
      maxAge的取值:
      整数:maxAge秒后失效,关闭浏览器,会自动被持久化到Cookie文件中,打开浏览器会重新加载至内存。
      负数:临时Cookie,关闭浏览器后,自动删除
      0 : 立即删除Cookie
Expires: 过期时间,和maxAge相关
Domain: 可以访问该Cookie的域名
      *域名设置:".baidu.com",所有以baidu.com结尾的域名都可以访问,注意第一个字符必须是点
      二级域名设置:“xxx.baidu.com”,只有xxx.baidu.com域名下的资源才可以访问
Path: 用于指定访问此Cookie的路径,如:
       1. path=/,domain=“www.baidu.com”,表示www.baidu.com域名下的资源都可以访问该Cookie
       2. path=/test,domain=“www.baidu.com”,表示www.baiud.com/test路径下的资源都可以访问该Cookie
       注意:如果符合了2的情况,那么1的情况也是符合的,因此,浏览器会将符合的cookie都放到请求头中,如果,存在相同的cookie名,则路径匹配越精确,cookie越靠前。Tomcat在读取Cookie的时候,如果存在Cookie名称相同的,则加载第一个匹配到的Cookie,其他相同的Cookie丢弃掉
HttpOnly: 为true,表示浏览器只能通过http请求,访问该cookie,无法通过js对Cookie进行读取、修改、删除等操作

1.3 浏览器加载Cookie规则

浏览器加载cookie的匹配规则: 将请求的URL路径与cookie的domain + path 进行匹配, 符合匹配规则的Cookie,都将被设置到请求头的cookie字段里面,如果存在多个相同的cookie名称,则匹配的精确度越高(先domain,在path),该cookie就设置的越靠前(多个相同的cookie,则tomcat只读取第一个)
       假设发起一个请求www.baidu.com/news,则加载cookie的规则如下
       cookie和session的联系
       “.baidu.com + / " : 表示请求的资源,域名是以baidu.com结尾的,都可以访问该cookie
       “www.baidu.com + /”: 表示请求的资源,域名是www.baidu.com的,都可以访问该cookie,即请求格式为:“www.baidu.com/xxx”
       “.baidu.com + /news” : 表示请求的资源,域名是以baidu.com结尾的,路径是/news开头的,都可以访问该cookie,即请求格式为:“xxx.baidu.com/news/xxx”
       “www.baidu.com + /news”: 表示请求的资源,域名是www.baidu.com,路径是/news开头的,都可以访问该cookie
       其中,匹配精确度先domain,在path,因此,匹配精确度由高到第分别是:“www.baidu.com + /news”,“www.baidu.com + / “,”.baidu.com + /news”,”.baidu.com + /"

2. session

由于http请求是无状态的,因此,每次访问服务器并不知道是否是已登录的用户。SESSION可以保存用户的登录信息,当下一个请求携带JSESSIONID过来时,通过JSESSIONID就可以查找到上一次请求的SESSION信息,从而判断是否已经登录过。

3. cookie和session的联系

cookie和session的联系
服务器通过在响应头中设置set-cookie字段将JSESSIONID返回给浏览器,浏览器将其保存到cookie中。当再次发起请求时,则浏览器将携带JSESSIONID信息到服务器,服务器通过JSESSIONID查找对应的SESSION。