目录
一、Cookie是什么?
二、Session是什么?
2.1 Session使用流程
三、Cookie 与 Session 的区别
四、核心方法
4.1 HttpServlet中关于Session的方法
4.2 HttpSession类中的方法
4.3 Cookie类中的方法
一、Cookie是什么?
Cookie是浏览器在本地存储数据的一种机制
- Cookie是从服务器来的,服务器在响应中会带有Set-Cookie字段,通过这个字段就可以通过服务器将需要保存在本地的数据返回
- 后续浏览器访问服务器的时候,就会把当前本地所有的Cookie都通过http请求带过去
- 利用Cookie保存当前用户的登录状态
在Cookie中保存用户的身份标识,此时的身份标识如何分配,以及身份信息具体如何储存,这个就是Session机制所做的工作
二、Session是什么?
服务器在同一时刻收到的请求是很多的,服务器需要清楚的区分每个请求都属于哪个用户,就需要在服务器中记录每个用户令牌以及用户信息的对应关系。
会话的本质就是一个“哈希表”, 存储了一些键值对结构。key 就是令牌的 ID(token/sessionId),value 就是用户信息(用户信息可以根据需求灵活设计)
sessionId 是由服务器生成的一个 “唯一性字符串”, 从 session 机制的角度来看,这个唯一性字符串称为 "sessionId"。但是站在整个登录流程中看待,也可以把这个唯一性字符串称为 "token"。sessionId 和 token 就可以理解成是同一个东西的不同叫法(不同视角的叫法)
2.1 Session使用流程
- 当用户登陆的时候,服务器在 Session 中新增一个新记录,并把 sessionId / token 返回给客户端。(例如通过 HTTP 响应中的 Set-Cookie 字段返回)。
- 客户端后续再给服务器发送请求的时候,需要在请求中带上 sessionId/ token。(例如通过 HTTP 请求中的 Cookie 字段带上)。
- 服务器收到请求之后,根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息,再进行后续操作。
Servlet 的 Session 默认是保存在内存中的。如果重启服务器则 Session 数据就会丢失
三、Cookie 与 Session 的区别
- Cookie 是客户端的机制,Session 是服务器端的机制。
- Cookie 和 Session 经常会在一起配合使用,但是不是必须配合
- 完全可以用 Cookie 来保存一些数据在客户端。这些数据不一定是用户身份信息,也不一定是 token / sessionId
- Session 中的 token / sessionId 也不一定通过 Cookie / Set-Cookie 传递。
四、核心方法
4.1 HttpServlet中关于Session的方法
HttpServletRequest 类中的相关方法
方法 | 描述 |
HttpSession getSession() | 在服务器中获取会话。参数如果为 true,当不存在会话时新建会话;参数如果 为 false,当不存在会话时返回 null |
Cookie[] getCookies() | 返回一个数组就,包含客户端发送该请求的所有的 Cookie 对象。会自动把 Cookie 中的格式解析成键值对 |
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Servlet// 在servlet中利用 HttpServletRequest获取到Session对象// 如果参数是true,当没有Session对象的时候就会主动创建,false则不会创建HttpSession session = req.getSession(true);// 利用创建好的session对象将用户信息存入session.setAttribute("user",user);}
HttpServletResponse 类中的相关方法
方法 | 描述 |
void addCookie(Cookie cookie) | 把指定的 cookie 添加到响应中 |
4.2 HttpSession类中的方法
一个 HttpSession 对象里面包含多个键值对。我们可以往 HttpSession 中存任何我们需要的信息
方法 | 描述 |
Object getAttribute(String name) | 该方法返回在该 session 会话中具有指定名称的对象,如果没 有指定名称的对象,则返回 null。 |
void setAttribute(String name, Object value) | 该方法使用指定的名称绑定一个对象到该 session 会话 |
boolean isNew() | 判定当前是否是新创建出的会话 |
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Servlet// 在servlet中利用 HttpServletRequest获取到Session对象// 如果参数是true,当没有Session对象的时候就会主动创建,false则不会创建HttpSession session = req.getSession(true);// 利用创建好的session对象将用户信息存入,其中user是实体类session.setAttribute("user",user);// 取出用户信息session.getAttribute("user");}
4.3 Cookie类中的方法
每个 Cookie 对象就是一个键值对
方法 | 描述 |
String getName() | 该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是Set-Cooke 字段设置给浏览器的) |
String getValue() | 该方法获取与 cookie 关联的值 |
void setValue(String newValue) | 该方法设置与 cookie 关联的值 |
- HTTP 的 Cooke 字段中存储的实际上是多组键值对。每个键值对在 Servlet 中都对应了一个 Cookie对象。
- 通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对
- 通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对