Session

在 Web 开发中,session(会话)是服务器为每个客户端(通常是浏览器)创建的一个临时存储区域,用于在多个请求之间保存用户的状态信息。

因为 HTTP 协议是无状态 的(每次请求都是独立的,服务器默认不会记住之前的请求),而 session 就是解决这个问题的机制,让服务器能识别 "同一个用户" 的多次请求。

为什么需要 session?

比如用户登录后,后续操作(如添加购物车、提交订单)都需要知道 "当前是哪个用户在操作",这时候就可以用 session 存储用户的登录状态。

session 的基本用法(以 Java 为例)

1、获取 session 对象

在 Controller 方法中直接声明 HttpSession 类型的参数,Spring MVC 会自动注入当前用户的 session 对象:

复制代码
@GetMapping("/test")
public String test(HttpSession session) {
    // 使用 session...
    return "test";
}

2、存储数据到 session

setAttribute(String key, Object value) 方法存储键值对:

复制代码
// 存储用户ID到session
session.setAttribute("userId", 123);
// 存储用户名到session
session.setAttribute("username", "张三");

3、从 session 中获取数据

getAttribute(String key) 方法获取,返回值是 Object 类型,需要强转:

复制代码
// 获取用户ID
Integer userId = (Integer) session.getAttribute("userId");
// 获取用户名
String username = (String) session.getAttribute("username");

4、删除 session 中的数据

removeAttribute(String key) 方法:

复制代码
// 移除用户名
session.removeAttribute("username");

5、设置 session 有效期

默认有效期一般是 30 分钟(不同服务器可能不同),可以手动设置:

复制代码
// 设置有效期为 60 秒(1分钟)
session.setMaxInactiveInterval(60); 

6、销毁 session

通常在用户退出登录时调用:

复制代码
session.invalidate(); // 销毁当前session,清除所有数据

session 的工作原理

  1. 客户端第一次请求服务器时,服务器创建一个 session,并生成一个唯一的 sessionId(类似一个随机字符串)。
  2. 服务器把 sessionId 通过 Cookie 发送给客户端(浏览器会自动保存)。
  3. 后续客户端的每次请求,都会自动带上这个 sessionId,服务器通过它找到对应的 session 对象,从而识别用户。

注意事项

  • session 存储在服务器内存中(或分布式缓存中),不要存太多数据,以免占用资源。
  • 不同用户的 session 是完全隔离的,彼此不能访问对方的数据。
  • 如果客户端禁用了 Cookie,服务器会通过 URL 重写 (在 URL 后拼接 sessionId)来传递会话标识,但这种方式不太安全,一般不常用。

简单说,session 就像服务器给每个用户分配的 "临时储物柜",用户可以存放和取用自己的东西,且不会和其他人的混淆。

相关推荐
风曦Kisaki几秒前
Kubernetes(K8s)笔记Day03: Pod命名空间,标签,Pod 的调度,污点与容忍度,Pod 常见状态和重启策略,Pod 生命周期
linux·运维·笔记·docker·云原生·容器·kubernetes
千维百策6662 分钟前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库
图件制作GIS,储量计算11 分钟前
未来已到,抓住机遇
运维·服务器
CIO_Alliance28 分钟前
AI+iPaaS解决方案:跨系统业务流程自动化助力企业AI化转型
运维·人工智能·自动化
音符犹如代码44 分钟前
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
java·jvm·spring boot
小园子的小菜44 分钟前
Java 并发编程:线程安全队列全解 —— 阻塞与非阻塞实现原理及源码深度剖析
java·开发语言
好好沉淀1 小时前
Windows 下升级 Maven 3.6.1 到 3.9.9 踩坑全记录
java·windows·maven
学无止境_永不停歇1 小时前
9. 缓冲区
linux·服务器·c++
dok121 小时前
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》(4) devicefile 设备号相关
linux·运维·服务器
CodexDave1 小时前
Python 自动化接单实战(一):把 CSV 需求做成配置驱动解析器
java·python·自动化·json·数据清洗·python自动化·csv处理