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 就像服务器给每个用户分配的 "临时储物柜",用户可以存放和取用自己的东西,且不会和其他人的混淆。

相关推荐
whatever who cares几秒前
android中,全局管理数据/固定数据要不要放一起?
android·java·开发语言
XMYX-04 分钟前
06 - Go 的切片、字典与遍历:从原理到实战
后端·golang
wb1895 分钟前
docker-ce容器技术重习
运维·笔记·docker·容器·云计算
C182981825756 分钟前
AI idea 集成claude code插件
java·ide·intellij-idea
架构师专栏6 分钟前
比 MQ 更轻的异步方案:Spring 内置的这个隐藏功能,很多人还不知道
后端
jiayong236 分钟前
第 4 课:怎么把一个大页面拆成多个组件
运维·服务器·前端
IT 行者6 分钟前
解决 IntelliJ IDEA 内存占用高的两个优化策略:GPU 渲染与虚拟内存配置
java·ide·intellij-idea·ai编程
Aric_Jones8 分钟前
从实战理解异步、并发并行与GIL:FastAPI vs SpringBoot
java·spring boot·fastapi
qq_8573058198 分钟前
ubuntu 22 源码安装bochs
linux·运维·ubuntu
A-刘晨阳8 分钟前
麒麟v10桌面版2403版本运行程序提示权限不足(KYSEC)
运维·云计算·操作系统·银河麒麟·麒麟桌面系统