Cookie与Session

两者都是为了保持访问用户与后端服务器的交互状态

客户端会话技术,将数据保存到客户端

客户端第一次访问时服务器时 服务器会返回一个设置cookie的响应头 此后在cookie有效期内 并且在cookie所允许的域名下 浏览器发起请求时都会自动携带这个cookie请求头

Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
    if ("time".equals(cookie.getName())){
        resp.getWriter().println(cookie.getValue());
    }
}
resp.addCookie(new Cookie("time", LocalDateTime.now().toString()));

实现原理

细节

特点

Session

Session用来解决Cookie数量多传输浪费的问题

Session的本质就是将一个ID存储在Cookie里 当用户访问后端服务器 后端服务器根据这个ID查找其对应的数据

使用

HttpSession session = request.getSession();
Object getAttribute(String name)  
void setAttribute(String name, Object value)
void removeAttribute(String name)

原理

Session的实现是依赖于Cookie的。

如果基于Cookie的Session不可用 浏览器会自动将其重写到URL中

session如何工作:

屏幕截图 2020-10-07 143107

session持久化:SessionManager

其会复制持久化没有过期的session

session的过期检查:

Tomcat的一个后台线程会定期检查每个session是否失效

值得注意的是 request.getSession()也会检查是否过期 如果过期就会创建一个新的session出来

细节

Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);

特点

分布式session

单独使用session或者cookie是无法满足需求的 一些分布式session架构将独立的服务器用来存储session 就可以达到session共享的目的

多端session: