什么是 Session?Web 开发中 Session 的使用与注意事项

什么是 Session?Web 开发中 Session 的使用与注意事项

✅ 引言

在 Web 开发中,HTTP 协议是无状态的,这意味着每次请求之间没有关联。为了实现用户登录、购物车、权限控制等功能,服务器需要一种机制来“记住”用户。Session(会话) 就是解决这一问题的核心技术之一。

本文将深入讲解:

  • 什么是 Session?
  • Session 的工作原理
  • 在 Java Web 和 Spring Boot 中如何使用 Session
  • 使用 Session 的最佳实践与常见注意事项
  • 安全风险与应对策略

并提供完整的 Java + Spring Boot 示例代码,帮助你全面掌握 Session 的使用。


📌 一、什么是 Session?

1.1 基本定义

Session(会话)是服务器端用于保存用户状态的一种机制。当用户访问服务器时,服务器为其创建一个唯一的会话(Session),并在内存或存储中保存该用户的相关信息(如登录状态、用户ID等)。

每个 Session 都有一个唯一的 Session ID,通常通过 Cookie 发送给客户端,后续请求中客户端携带该 ID,服务器据此识别用户。想象 Session 就像超市给你的会员卡,第一次访问时服务器给你生成一张唯一的 “会员卡”(Session ID),以后每次访问你都出示这张卡,服务器就能通过卡片识别你的身份和之前的操作记录。

1.2 工作流程图解

在这里插入图片描述

1.3 Session 的工作原理

Session的工作流程可以分为四个阶段:

  1. 创建阶段:当用户第一次访问服务器时,服务器会生成一个唯一的Session ID,并创建对应的Session对象存储用户数据。
  2. 传输阶段:服务器通过Set-Cookie响应头,将Session ID发送给客户端,客户端会将其保存在Cookie中。
  3. 验证阶段:后续请求中,客户端会自动在Cookie中携带Session ID,服务器通过这个ID找到对应的Session对象。
  4. 销毁阶段:当用户登出或会话超时后,服务器会删除Session对象,客户端Cookie也会被清除或标记为过期。

📌 二、Session 的使用场景

  • 用户登录状态保持
  • 购物车信息存储
  • 表单防重复提交
  • 一次性验证码(如短信验证码)
  • 权限控制与访问记录

📌 三、Java Web 中使用 Session(原生 Servlet)

3.1 获取或创建 Session

@WebServlet("/login")publicclassLoginServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp){String username = req.getParameter("username");// 获取或创建 SessionHttpSession session = req.getSession();// 存储用户信息 session.setAttribute("username", username); session.setAttribute("loginTime",newDate()); resp.getWriter().println("登录成功,欢迎 "+ username);}}

3.2 读取 Session 数据

@WebServlet("/profile")publicclassProfileServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp){HttpSession session = req.getSession(false);// 不自动创建if(session !=null&& session.getAttribute("username")!=null){String username =(String) session.getAttribute("username");Date loginTime =(Date) session.getAttribute("loginTime"); resp.getWriter().println("用户:"+ username +",登录时间:"+ loginTime);}else{ resp.setStatus(401); resp.getWriter().println("请先登录");}}}

3.3 注销 Session

@WebServlet("/logout")publicclassLogoutServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp){HttpSession session = req.getSession(false);if(session !=null){ session.invalidate();// 销毁 Session} resp.getWriter().println("已退出登录");}}

📌 四、Spring Boot 中使用 Session

4.1 启用 Session 支持(默认已开启)

@RestControllerpublicclassUserController{@PostMapping("/login")publicStringlogin(@RequestParamString username,HttpServletRequest request){HttpSession session = request.getSession(); session.setAttribute("username", username);return"登录成功,用户:"+ username;}@GetMapping("/info")publicStringgetUserInfo(HttpServletRequest request){HttpSession session = request.getSession(false);if(session !=null&& session.getAttribute("username")!=null){return"当前用户:"+ session.getAttribute("username");}return"未登录";}@GetMapping("/logout")publicStringlogout(HttpServletRequest request){HttpSession session = request.getSession(false);if(session !=null){ session.invalidate();}return"已退出";}}

4.2 使用 @SessionAttribute 注解(更优雅)

@Controller@SessionAttributes("user")publicclassSessionController{@PostMapping("/login")publicStringlogin(@RequestParamString username,Model model){ model.addAttribute("user",newUser(username));return"redirect:/dashboard";}@GetMapping("/dashboard")publicStringdashboard(@SessionAttribute("user")User user,Model model){ model.addAttribute("user", user);return"dashboard";}}

📌 五、Session 的注意事项与最佳实践

5.1 安全性问题

风险解决方案
Session 劫持使用 HTTPS、设置 SecureHttpOnly Cookie
Session 固定攻击登录成功后调用 session.invalidate() 并创建新 Session
Session 泄露敏感信息不要存入 Session(如密码)
// 在 Spring Boot 中配置 server.servlet.session.cookie.http-only=true server.servlet.session.cookie.secure=true server.servlet.session.cookie.same-site=strict 

5.2 性能与可扩展性

  • 内存占用:Session 默认存储在服务器内存中,大量用户会消耗内存。
  • 集群部署问题:多台服务器时,Session 无法共享。
解决方案:
  • 使用 Redis 存储 Session(推荐)
  • 使用 Spring Session + Redis
<!-- pom.xml --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>
# application.ymlspring:session:store-type: redis redis:host: localhost port:6379

5.3 Session 过期时间

# application.ymlserver:servlet:session:timeout: 30m # 30分钟

或在代码中设置:

session.setMaxInactiveInterval(1800);// 秒

✅ 总结

项目说明
Session 本质服务器端状态保持机制
核心原理通过 Session ID 识别用户
优点简单易用、数据安全(不暴露给客户端)
缺点占用服务器资源、集群部署需共享
最佳实践使用 Redis 存储、设置合理过期时间、防止 Session 劫持
替代方案JWT(无状态认证)

📚 推荐

Read more

在 Dynamics 365 Business Central 中落地 Copilot:从概念到实操

前言 在大型 BC 实施项目中,我们常见到业务用户期待更智能、更主动的 ERP 助手:自动提醒审批、发现订单异常、提醒发货延误或建议成本分摊。Copilot 把 AI 能力嵌入 BC,形成“可执行的建议与任务”。本文把理论与实践结合,帮助你把 Copilot 安全、高效地投入使用。 常见功能与示例分析 1、Suggest Line: 1. 可直接输入物料编号,描述,条码,属性,类别等部分信息,Copilot即可识别 可上传CSV文件,插入物料行 2、Analysis List 可在已有分析视图的基础上,进一步细化 下图为筛选某一阶段的分析视图,注意一定要指明按什么日期,比如Document date, 直接说明找2030年8月份的订单无法识别。 下图为可将某客户订单金额汇总 按物料类别显示平均成本 Keep it选择保留该分析视图

【AIGC文生图】通义万相2.1应用拓展与蓝耘云平台实践

【AIGC文生图】通义万相2.1应用拓展与蓝耘云平台实践

探索调参之道:通义万相2.1应用拓展与平台调优实践 近年来,随着生成模型不断迭代升级,通义万相在图像生成领域的表现愈发引人瞩目。相比于基础的文生图使用,如何在平台应用拓展和参数调优上发掘更大潜力,已成为众多开发者与工程师关注的热点。本文将从实际应用案例出发,分享一些调参心得与平台优化策略,并着重探讨蓝耘GPU平台在这方面的独特优势,力求帮助读者快速上手并走上创新之路。 一、通义万相2.1来临 前几日,通义官方发布了万相最新文生图模型2.1。 通义万相2.1在模型底层和交互体验上都有显著升级,具体来说: * 模型参数与语义理解升级 新版本参数规模已经突破千亿级别,使得对输入文本的语义捕捉更为精准,能更好地理解复杂描述,生成的图像在细节和质感上都有明显提升。与此同时,内置的智能改写功能可以自动优化用户输入,使得图像风格和表现更符合预期。 * 生成速度与细节表现的提升 得益于优化的算法和模型架构,生成速度大幅加快,尤其在高分辨率(最高支持200万像素)输出时,依然能保持流畅高效。同时,细节表现力增强后,无论是人物表情、光影效果还是场景布置,都能呈现得更加生动自

生成的甚么玩意 Õ_Õ ?基于 LoRA+Stable Diffusion 的100种动物图像生成

生成的甚么玩意 Õ_Õ ?基于 LoRA+Stable Diffusion 的100种动物图像生成

生成的甚么玩意 Õ_Õ ?基于 LoRA+Stable Diffusion 的100种动物图像生成 代码详见:https://github.com/xiaozhou-alt/Animals_Generationn 文章目录 * 生成的甚么玩意 Õ_Õ ?基于 LoRA+Stable Diffusion 的100种动物图像生成 * 一、项目介绍 * 二、文件夹结构 * 三、数据集介绍 * 四、Stable Diffusion 与 LoRA 模型介绍 * 1. Stable Diffusion 模型架构解析 * 1.1 变分自编码器(VAE) * 1.2 CLIP 文本编码器 * 1.3

【GitHub开源AI精选】WhisperX:70倍实时语音转录、革命性词级时间戳与多说话人分离技术

【GitHub开源AI精选】WhisperX:70倍实时语音转录、革命性词级时间戳与多说话人分离技术

系列篇章💥 No.文章1【GitHub开源AI精选】LLM 驱动的影视解说工具:Narrato AI 一站式高效创作实践2【GitHub开源AI精选】德国比勒费尔德大学TryOffDiff——高保真服装重建的虚拟试穿技术新突破3【GitHub开源AI精选】哈工大(深圳)& 清华力作 FilmAgent:剧本自动生成 + 镜头智能规划,开启 AI 电影制作新时代4【GitHub开源AI精选】Lumina - Image 2.0 文生图模型,以小参数量实现高分辨率多图生成新突破5【GitHub开源AI精选】探索 Mobile-Agent:X-PLUG 推出的创新型移动智能操作代理6【GitHub开源AI精选】吴恩达团队开源VisionAgent:用自然语言开启计算机视觉新时代7【GitHub开源AI精选】Oumi:一站式AI开发平台,涵盖训练、评估与部署全流程8【GitHub开源AI精选】深入剖析RealtimeSTT:开源实时语音转文本库的强大功能与应用9【GitHub开源AI精选】PodAgent:多智能体协作播客生成框架,