Java Web开发:Session与Cookie详细入门指南

在Web开发中,状态管理是核心需求之一。本文将深入讲解Java中Session和Cookie的使用方法,帮助你掌握用户状态管理的核心技术。

一、Session与Cookie基础概念

特性SessionCookie
存储位置服务器内存/持久化存储客户端浏览器
安全性较高(敏感数据推荐使用)较低(可被用户查看修改)
生命周期会话结束或超时(默认30分钟)可设置过期时间(浏览器关闭或指定时间)
数据类型支持Java对象仅字符串(最大4KB)
主要用途用户登录状态、购物车等记住登录、用户偏好设置等

二、Cookie操作详解

1. 创建Cookie
// 创建Cookie
Cookie userCookie = new Cookie("username", "john_doe");// 设置有效期(7天)
userCookie.setMaxAge(7 * 24 * 60 * 60); // 设置作用路径(整个应用)
userCookie.setPath("/"); // 启用HTTPS Only(增强安全)
userCookie.setSecure(true);// 防止客户端脚本访问(防XSS)
userCookie.setHttpOnly(true);// 添加到响应
response.addCookie(userCookie);
2. 读取Cookie
// 获取所有Cookie
Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("username".equals(cookie.getName())) {String username = cookie.getValue();// 使用cookie值...}}
}
3. 删除Cookie
// 创建同名Cookie
Cookie deleteCookie = new Cookie("username", "");// 设置立即过期
deleteCookie.setMaxAge(0); // 必须匹配原路径
deleteCookie.setPath("/"); response.addCookie(deleteCookie);

三、Session操作详解

1. 获取/创建Session
// 获取现有session或创建新session
HttpSession session = request.getSession();// 检查是否新创建的session
if (session.isNew()) {System.out.println("新会话已创建");
}
2. 存储和获取Session数据
// 存储数据
User user = new User("John", "john@example.com");
session.setAttribute("currentUser", user);// 获取数据
User storedUser = (User) session.getAttribute("currentUser");// 移除数据
session.removeAttribute("currentUser");// 获取所有属性名
Enumeration<String> attrNames = session.getAttributeNames();
3. Session生命周期控制
// 设置超时时间(分钟)
session.setMaxInactiveInterval(15 * 60); // 立即终止会话
session.invalidate(); // 监听器配置(web.xml)
<session-config><session-timeout>30</session-timeout> <!-- 30分钟 -->
</session-config>

四、Session与Cookie协同工作流程

五、登录状态保持实战示例

1. 登录处理Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) {String username = request.getParameter("username");String password = request.getParameter("password");if (authenticate(username, password)) {// 创建SessionHttpSession session = request.getSession();session.setAttribute("user", username);// 创建"记住我"Cookieif ("on".equals(request.getParameter("remember"))) {Cookie rememberCookie = new Cookie("rememberUser", username);rememberCookie.setMaxAge(30 * 24 * 60 * 60); // 30天response.addCookie(rememberCookie);}response.sendRedirect("dashboard.jsp");} else {response.sendRedirect("login.jsp?error=1");}
}
2. 登录状态检查过滤器
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;HttpSession session = request.getSession(false);String requestURI = request.getRequestURI();// 排除登录页面和静态资源if (requestURI.endsWith("login.jsp") || requestURI.contains("/assets/")) {chain.doFilter(request, response);return;}// 检查Session登录状态if (session != null && session.getAttribute("user") != null) {chain.doFilter(request, response);} // 检查"记住我"Cookieelse if (checkRememberCookie(request)) {chain.doFilter(request, response);} // 未登录重定向else {response.sendRedirect("login.jsp");}
}

六、安全最佳实践

  1. Session安全

    • 用户登出时调用session.invalidate()

    • 避免在URL中传递Session ID(禁用URL重写)

      <!-- web.xml配置 -->
      <session-config><tracking-mode>COOKIE</tracking-mode>
      </session-config>
  2. Cookie安全

    • 敏感信息永远不要存储在Cookie中

    • 始终设置HttpOnlySecure属性

      cookie.setHttpOnly(true);
      cookie.setSecure(request.isSecure()); // 根据当前连接启用
    • 防御会话固定攻击

      // 登录成功后更换Session ID
      request.changeSessionId();
    • 分布式Session管理

      <!-- 使用Redis存储Session -->
      <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
      </dependency>

七、常见问题解决方案

问题1:浏览器禁用Cookie后Session失效
解决方案:URL重写(慎用)

// 在URL中添加;jsessionid=xxx
String url = response.encodeURL("dashboard.jsp");
out.print("<a href='" + url + "'>Dashboard</a>");

问题2:分布式环境Session共享
解决方案:使用集中存储

  • Redis(推荐):spring-session-data-redis

  • 数据库:org.apache.tomcat.session.persist.ManagerBase

问题3:Session超时处理

// 监听Session销毁
public class SessionListener implements HttpSessionListener {@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// 执行清理操作}
}

八、总结与学习资源

核心要点

  1. Session用于存储敏感/重要数据,Cookie用于持久化偏好设置

  2. 始终遵循最小权限原则,只存储必要数据

  3. 安全性配置(HttpOnly、Secure)必不可少

  4. 分布式环境使用集中式Session存储

学习资源

  • Oracle官方Session文档

  • RFC 6265 Cookie标准

  • OWASP会话管理指南

最佳实践建议:对于新项目,建议使用JWT(JSON Web Tokens)结合HTTP Only Cookie实现现代认证方案,可参考Spring Security的OAuth2支持。

掌握Session和Cookie的使用是Java Web开发的必备技能。建议从简单的登录功能开始实践,逐步扩展到购物车、用户偏好等复杂场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92962.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS与CA证书:安全通信全解析

CA&#xff08;Certificate Authority&#xff09;&#xff1a;证书颁发机构&#xff0c;负责签发和管理数字证书&#xff0c;验证证书持有者的身份。HTTPS&#xff1a;基于 SSL/TLS 协议的 HTTP&#xff0c;通过证书实现客户端与服务器的身份验证和数据加密。HTTPSHTTPSSL/TLS…

AI生成代码时代的商业模式重构:从“软件即产品”到“价值即服务”

2025年,全球AI代码生成市场规模突破63亿元(数据来源:《中国AI代码生成行业发展报告》),开发者效率提升40%以上,软件开发成本下降30%。这一技术浪潮正在颠覆传统软件行业的商业逻辑——当代码生成变得像文字编辑一样简单时,企业如何构建可持续的商业模式? 本文将从硬件…

C#特性与反射知识梳理

C#中的**特性&#xff08;Attributes&#xff09;和反射&#xff08;Reflection&#xff09;**是两个非常重要的概念&#xff0c;它们通常用于代码的元编程&#xff0c;允许你在运行时获取类型信息并对其进行操作。下面对这两个概念进行详细梳理&#xff1a;一、C#中的特性&…

SQL 语法详解

SQL 语法详解 引言 SQL&#xff08;Structured Query Language&#xff09;是一种用于数据库管理的标准语言&#xff0c;它允许用户进行数据的查询、更新、插入和删除等操作。SQL语法是数据库管理和编程的基础&#xff0c;本篇文章将详细介绍SQL的基本语法和常用操作&#xff0…

为什么 sim(3) 中的尺度 s 与旋转 R 相乘,而不是平移 t?

文章目录为什么 sim(3) 中的尺度 s 与旋转 R 相乘&#xff0c;而不是平移 t&#xff1f;1️⃣ sim(3) vs SE(3)&#xff1a;结构对比与核心差异2️⃣ 为什么尺度 s 不乘在 t 上&#xff1f;&#x1f6ab; 数学破坏&#xff1a;&#x1f9ed; 几何解释&#xff1a;3️⃣ t 是“相…

如何为你的 Docker 容器设置代理网络

一文搞定!如何为你的 Docker 容器设置代理网络(及一个最常见的“坑”) 你是否遇到过这样的窘境:在你的服务器上,代理工具(比如 Clash, V2Ray)运行得好好的,浏览器也能科学上网,但一旦把应用放进 Docker 容器,它就瞬间“失联”,无法访问外部世界? 别担心,这是每个…

LeetCode Day3 -- 哈希表

目录 1. 啥是哈希表&#xff1f; 2. 啥时候用哈希表&#xff1f; 2.1 存在性检查 → 集合Set 2.2 键值映射 → 字典Dict 2.3 频率统计 → Dict or Counter 3. LeetCode 3.1 集合 &#xff08;1&#xff09;2215 找出两数组的不同 &#xff08;2&#xff09;1207 独一无…

三子棋装置(电赛24E题)K230/STM32全开源

三子棋装置&#xff08;电赛24E题&#xff09;K230/STM32全开源&#xff0c;后续有具体代码参数讲解&#xff0c;帮助大家移植k230代码import time, os, sysfrom media.sensor import * from media.display import * from media.media import *from machine import UART from m…

终端安全检测与防御

1. 终端安全风险主要问题&#xff1a;企业网络中80%的安全事件源于终端&#xff0c;终端成为黑客攻击的重要目标。攻击手段&#xff1a;勒索病毒&#xff1a;直接勒索用户。横向渗透&#xff1a;通过受控终端攻击内部服务器。僵尸网络危害&#xff1a;信息窃取、钓鱼网站引导、…

Video_AVI_Packet(2)

博主声明&#xff1a;内容来自网络&#xff0c;仅供参考&#xff0c;仅适用于浅了解&#xff0c;如有错误&#xff0c;自行甄别&#xff0c;由此引起的后果概不负责 Video_AVI_Packet&#xff08;2&#xff09;一、Video Picture Aspect Ratio 与 Active Format Aspect Ratio1.…

八月补丁星期二:微软修复 111 个漏洞

微软将在2025 年 8 月补丁星期二修复 111 个漏洞&#xff0c;这一数量与近期平均水平大致相同。 与上个月的情况类似&#xff0c;微软知道今天发布的漏洞中只有一个已被公开披露&#xff0c;但声称没有证据表明存在野外利用。同样&#xff0c;截至发布时&#xff0c;唯一的补丁…

《C++进阶之继承多态》【普通类/模板类的继承 + 父类子类的转换 + 继承的作用域 + 子类的默认成员函数】

【普通类/模板类的继承 父类&子类的转换 继承的作用域 子类的默认构造函数】目录前言&#xff1a;------------------------一、继承的定义和使用1. 什么使继承&#xff1f;2. 为什么要引入继承&#xff1f;3. 怎么使用继承&#xff1f;① 父类&#xff08;基类&#xf…

Ubuntu22.04安装OBS Studio

OBS官网的最新的虽然支持Ubuntu系统&#xff0c;但是只支持最新的24.2版本的&#xff0c;而我的电脑上的Ubuntu的版本是22.04&#xff0c;所以在网上寻求解决办法&#xff0c;看到了这一片博客&#xff0c;作为参考来实现ubuntu22.04安装OBS&#xff0c;这里提示一下&#xff0…

Ansible 基本使用

Ansible 清单 静态主机清单 主机清单支持多种格式&#xff0c;例如ini、yaml、脚本等。 本次课程使用 ini 格式。 #创建主机清单[lykcontroller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4​#测试连接单个服务器[lykcontroller ~ 14:08:18]$ ansibl…

网络资源模板--基于Android Studio 实现的九寨沟App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情&#xff08;部分) 首页 购票页面 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也…

系统架构设计师备考之架构设计实践知识

1.信息系统架构设计理论与实践1.1.基本概念信息系统架构定义目前关于信息系统架构较为权威的定义有&#xff1a; &#xff08;1&#xff09;信息系统架构是系统的结构&#xff0c;由软件元素、元素外部可见属性和元素间关系组成。 &#xff08;2&#xff09;信息系统架构是软件…

【IgH EtherCAT】如何利用 RTAI 提供的实时任务和调度机制来构建一个高精度、确定性的工业控制应用

SVG图展示了系统的分层架构&#xff1a;RTAI实时层&#xff1a;包含RT_TASK、信号量和定时器EtherCAT Master层&#xff1a;主站、域、从站配置和PDO映射EtherCAT网络层&#xff1a;与实际硬件设备&#xff08;EL3162模拟输入、EL2004数字输出&#xff09;通信关键特点&#xf…

7款热门智能电视文件管理器横向评测

7款智能电视文件管理器横向评测 在智能电视和电视盒子日益普及的今天&#xff0c;一款好用的文件管理器能让您的数字生活更加便捷。本文为您评测了7款广受欢迎的TV版文件管理器&#xff0c;助您找到最适合自己的工具。 1. ES文件浏览器TV版 ES文件浏览器是一款广受欢迎的多功能…

Python 类元编程(导入时和运行时比较)

导入时和运行时比较 为了正确地做元编程&#xff0c;你必须知道 Python 解释器什么时候计算各个代码 块。Python 程序员会区分“导入时”和“运行时”&#xff0c;不过这两个术语没有严 格的定义&#xff0c;而且二者之间存在着灰色地带。在导入时&#xff0c;解释器会从上到 下…

[git diff] 对比检查变更 | 提交前复审 | 版本回退

git diff git diff 是 Git 版本控制系统中用于比较文件差异的核心命令&#xff0c;可以显示工作目录、暂存区&#xff08;Index&#xff09;和仓库历史之间的变化。 通过对比不同版本或状态的文件内容&#xff0c;帮助开发者理解代码变更。 比较工作目录与暂存区 运行以下命令查…