了解Cookie
Cookie是浏览器在本地保存数据的一种机制,即将数据保存在客户端
那么为什么要出现这个机制?
- web用HTTP协议传输数据,HTTP协议本身是属于“无状态”协议,即默认情况下HTTP协议的客户端和服务器的这次通信与下一次客户端和服务器通信没有直接联系。举例来说:在用户登录一个网站时,输入账号和密码,这次就登录进去了,下次登录的话若没有Cookie机制用户则需要重新输入账号和密码,而在实际需求和开发中,显然这种机制是符合实际的。这样以来第二次访问的时候服务器就能知道此次请求是否已经登录过了,登录过就不会再进行重新登陆了。
Cookie从哪里来
Cookie是从服务器来的。服务器在响应中会带有Set-Cookie字段。
Cookie到哪里去
在客户端访问服务器的时候,就会把本地所有的Cookie通过HTTP请求带回给服务器
了解Session
Session是服务器端用来保存用户数据,区分用户身份的机制
- 在上述举例中,当客户端登录给服务器发送请求时,对于服务器来说同一时间发送的请求是很多的,那么这时就需要服务器区分请求是从哪个客户端发过来的,就需要在服务器这边记录一一对应的用户的信息。这就是Session(会话)的机制。
- Session的本质就是一个哈希表,里面存储很多键值对,Key-Value,其中Key就是SessionId(也叫token),它是服务器给客户端响应分配的一个SessionId,Value用来记录当前用户的一些身份信息。
- SessionId会返回到浏览器的Cookie中,在Cookie中记录保存下来,在之后客户端访问服务器就会将有SessionId的Cookie返回给服务器,服务器可以依据这个SessionId找到对应的用户身份信息。
- 在我们请求中,如果请求带有SessionId,服务器就会自动找到此Session的对象(对应Value)以进行后面操作,如果没有SessionId那么服务器就会创建一个Session对象,并将SessionId返回给浏览器,可以存放到Cookie中,也可以存放在别的地方。
注意:在上述过程中,前提是 HttpSession getSession()方法设置为true,这样请求中不存在SessionId才可以创建Session对象。为false时,不会创建新的对话,并返回null
- 当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId / token 返回给客户端。可以通过HTTP 响应中的 Set-Cookie 字段返回
- 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId/ token。可以通过 HTTP 请求中的 Cookie 字段带上
- 服务器收到请求之后, 根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息,之后再进行后续操作
- 注意:Servlet的Session默认是保存在内存中的,如果重启服务器Session数据会丢失。
Cookie和Session的区别
1.Cookie是客户端保存数据的机制,Session是服务器端保存数据的机制
2.Cookie和Session经常会在一起使用,例如通过Set-Cookie字段给客户端返回Session记录,通过Cookie字段将SessionId带上给服务器发送请求。但它们俩不一定必须配合使用,即
- 完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是
token / sessionId- Session 中的 token / sessionId 也不需要非得通过 Cookie / Set-Cookie 传递