在 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 的工作原理
- 客户端第一次请求服务器时,服务器创建一个 session,并生成一个唯一的
sessionId
(类似一个随机字符串)。 - 服务器把
sessionId
通过 Cookie 发送给客户端(浏览器会自动保存)。 - 后续客户端的每次请求,都会自动带上这个
sessionId
,服务器通过它找到对应的 session 对象,从而识别用户。
注意事项
- session 存储在服务器内存中(或分布式缓存中),不要存太多数据,以免占用资源。
- 不同用户的 session 是完全隔离的,彼此不能访问对方的数据。
- 如果客户端禁用了 Cookie,服务器会通过 URL 重写 (在 URL 后拼接
sessionId
)来传递会话标识,但这种方式不太安全,一般不常用。
简单说,session 就像服务器给每个用户分配的 "临时储物柜",用户可以存放和取用自己的东西,且不会和其他人的混淆。