ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Spring MVC(3)-Cookie和Session

Spring MVC(3)-Cookie和Session

1.HTTP协议无状态

什么叫无状态?

HTTP协议是无状态的,就是没有记忆力

默认情况下HTTP协议的客户端和服务器之间这次通信,和下次通信之间没有直接的联系。

Cookie客户端

Session服务器

Session类似于一个哈希表,存储键值对结构

2.一个客户端对应一个sessionID

当用户登陆服务器时,服务器会在Session中新增一个记录,并把【sessionId】返回给【客户端】(通过HTTP响应中的Set-Cookie字段返回)

——》客户端后续再给服务器发送请求的时候,都会在请求中带上【sessionId】(通过HTTP请求中的Cookie字段带上)

——》服务器收到请求后,根据请求中的sessionId 在Session信息中获取到 对应用户信息,再进行后续操作;如果根据sessionId找不到对应Session信息,服务器就会重新创建Session,并把SessionId返回给客户端。

3.获取Cookie

1.传统获取Cookie

内置对象

2.简洁获取Cookie

@CookieValue

@CookieValue String type

直接从本次请求携带的Cookie里取出指定名字的【Cookie值】

,并赋值给后面的参数【type】

4.获取Session

getSession()底层等价于getSession(true),作用是:拿到当前请求对应的HttpSession对象;

true:

如果这个请求已经带了JSESSIONID,服务器找到对应的session,返回这个session;

如果没有找到session,服务器会自动创建一个Session,并且把新的sessionId放到Cookie返回给浏览器。

false:

如果能找到对应的session,返回这个session;

如果没有找到session,不会创建,直接返回null。

客户端请求

服务器会set-Cookie返回一个值

客户端把这个值设置进Cookie里。

接收参数【HttpServletRequest】与【HttpRequest】的区别

HttpSession:Spring MVC底层帮你调用request.getSession(),把session对象直接传进来。

5.设置Session

设置session前 先获取session

获取session

服务端有多个HttpSession

每一个访问网站的浏览器用户,都会单独分配一个属于她的Session对象。各个session对象互不干扰,服务器内部用以一个map存。

第一次getSession对象

用户第一次访问网站,浏览器还没有JSESSIONID这个Cookie。调用getSession(),服务器新建一个Session,生成唯一的sessionId,把sessionId放到Cookie里返回给浏览器,浏览器存下这个Cookie

后续getSession对象的区别(根据代码)

true:浏览器带着JSESSIONID来,服务器拿着sessionId去找对应的session,找到就返回已有的,找不到就返回一个新建的

false:找到就返回已有的,找不到直接返回null

根据sessionId取到对应的session对象

浏览器每次请求自动带上Cookie(里面存着sessionId)。服务器拿到这个sessionId,去session容器里按id找对应的session,后续就可以读取里面存的信息

换sessionId

可以调用session.invalidate()让当前 session 直接失效

重启服务器session会丢失,要重新设置

Tomcat的session默认存在服务器内存里,服务器一关,内存全部清空,所有session直接消失

6.获取Header

1.

2.@RequestHeader

@RequestHeader ("User-Agent") String UserAgent:

从请求头里取出指定名字的请求头的值,赋给后面的参数UserAgent

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进