Cookie是啥?
浏览器提供的在客户端存储数据的一种机制。(由于浏览器禁止了网页中的代码直接访问磁盘的文件因此要想再网页中实现数据的持久化存储、就可以使用Cookie这样的机制
Cookie 里面存什么?
键值对结构.键和值都是程序猿自定义的~
Cookie从哪里来?
服务器返回响应的时候。可以把要在客户端保存的数据以Set-Cookie这个 header的方式来返回给浏览器~
Cookie到哪里去?
客户端下次访问服务器的时候,就会把之前保存好的cookie再发给服务器~
但是关于Cookie有一个非常典型的使用场景:
使用Cookie来保存用户的登录信息~
很多网站登录成功后,再继续访问这个网站的其他页面,就不需要重新输入用户名密码了~
Cookie
HTTP 协议自身是属于 "无状态" 协议.
"无状态" 的含义指的是:
默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系
但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的
例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求是否是已经登陆过了.
图中的 "令牌" 通常就存储在 Cookie 字段中
理解会话机制 (Session)
服务器同一时刻收到的请求是很多的. 服务器需要清除的区分清楚每个请求是从属于哪个用户, 就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系.
会话的本质就是一个 "哈希表", 存储了一些键值对结构. key 就是令牌的 ID(token/sessionId), value 就是用户信息(用户信息可以根据需求灵活设计).
sessionId 是由服务器生成的一个 "唯一性字符串", 从 session 机制的角度来看, 这个唯一性字符串称为 "sessionId". 但是站在整个登录流程中看待, 也可以把这个唯一性字符串称为 "token".sessionId 和 token 就可以理解成是同一个东西的不同叫法(不同视角的叫法)
- 当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId / token 返回给客户端.(例如通过 HTTP 响应中的 Set-Cookie 字段返回).
- 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId/ token. (例如通过 HTTP 请求中的 Cookie 字段带上).
- 服务器收到请求之后, 根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息,再进行后续操作.
Cookie 和 Session 的区别
- Cookie 是客户端的机制. Session 是服务器端的机制
- Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合.
- 完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是token / sessionId
- Session 中的 token / sessionId 也不需要非得通过 Cookie / Set-Cookie 传递.
- cookie是客户端(浏览器)存储数据的一种机制.可以存储身份信息,也可以存储别的.都是程序猿自己定义的.
- session是服务器存储数据的一种机制.也是键值对结构的.主要就是用来存储身份相关的信息的.
核心方法
HttpServletRequest 类中的相关方法
HttpServletResponse 类中的相关方法
HttpSession 类中的相关方法
一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息.
Cookie 类中的相关方法
每个 Cookie 对象就是一个键值对.
- HTTP 的 Cooke 字段中存储的实际上是多组键值对. 每个键值对在 Servlet 中都对应了一个 Cookie对象.
- 通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对.
- 通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对.
代码示例: 实现用户登陆
运行结果:
重启服务器:
删除cookie