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

相关推荐
桦说编程7 小时前
CompletableFuture 异常处理常见陷阱——非预期的同步异常
后端·性能优化·函数式编程
凸头7 小时前
以AtomicInteger为例的Atomic 类的底层CAS细节理解
java·jvm·算法
筑梦之路7 小时前
深入linux的审计服务auditd —— 筑梦之路
linux·运维·服务器
陈说技术7 小时前
服务器CPU达到100%解决思路
运维·服务器
艾派森7 小时前
基于 Rokid CXR-M SDK 构建 AR 远程专家协作系统:从零实现眼镜端自定义 UI 与实时交互
java
李广坤7 小时前
Springboot解决跨域的五种方式
后端
hi_link7 小时前
centos系统将/home分区的空间分配给/
linux·运维·centos
赴前尘8 小时前
Go 通道非阻塞发送:优雅地处理“通道已满”的场景
开发语言·后端·golang
cxyxiaokui0018 小时前
🔥不止于三级缓存:Spring循环依赖的全面解决方案
java·后端·spring
UCoding8 小时前
我们来学AI编程 -- vscode开发java
java·vscode·ai编程