【前言】默认HTTP的请求是无状态的(无状态就是默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 就是我可以会话,但不知道在和谁会话)
谁在跟http会话,该跟谁会话了——Cookie + Session机制
- Cookie是请求会话的身份凭证,是标识对象的凭证
- Session是纯后台的数据,记录Cookie(身份凭证信息)及其对应着的用户信息
基本原理
(1)Cookie角度
Cookie是浏览器-服务器之间的:
浏览器需要保存Cookie,在合适的请求中携带Cookie,表现为HTTP请求头中的Cookie Header
服务器生成Cookie并传递给浏览器,表现为响应头中的set Cookie
用户第一次登录——>服务端为该用户生成一个Cookie,并把Cookie返回给用户——>之后,在Cookie有效期内,该用户都携带Cookie
Cookie实则是key-value对,其中有个key是session-id,服务端根据Cookie中的session-id来唯一标识用户的专属数据
(2)Session角度——通过Session-id找到唯一对应的一组客户数据
服务端这边使用Session来记录Cookie及其对应着的用户信息,每一个用户对应的session-id都是唯一的,服务端将session-id发给用户后,用户每一个连接都需要携带session-id,比如携带在Cookie中
(3)二者相互配合
所以,Cookie是身份凭证,是客户端的机制,而Session则是服务端的机制,一般,将Session-id发给客户端后,客户端将其携带在Cookie中,二者相互配合,以达到会话管理的目的
Servlet 的 Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.
Cookie
第一次访问,需要办理Cookie,然后准备专属的数据柜(Session)
req.getSession(true);
// true的含义:如果是会员,则返回之前的柜子,如果不是会员,则新建一个新柜子
// fals的含义:不创建会员
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;
/**Cookie-Session机制
* @author sunny
* @date 2022/06/16 19:52
**/
@WebServlet("/firstVisited")
public class