在上一篇内容中我们已经掌握了Java Web的基础框架——Tomcat容器的核心目录与部署方式以及Servlet的核心原理、请求响应对象的使用。本节课我们将进入进阶环节聚焦会话跟踪技术Cookie与Session、Servlet的配置对象ServletContext与ServletConfig并通过一个完整的登录实战案例将所有知识点串联起来帮你真正做到学以致用理解Java Web请求处理与数据管理的底层逻辑。三、Cookie客户端会话跟踪技术3.1 Cookie 核心概念Cookie是**存储在客户端浏览器的键值对数据**由服务器生成通过响应头发送给浏览器浏览器下次请求时会携带Cookie实现会话跟踪如记住登录状态、记录上次访问时间。简单来说Cookie就相当于服务器给浏览器的“身份标签”浏览器每次访问该服务器时都会带上这个标签让服务器识别出当前访问的是哪个用户从而实现状态保持——毕竟HTTP协议本身是无状态的无法记住每次请求的关联关系Cookie正是解决这一问题的客户端方案。3.2 Cookie 核心操作1. 创建Cookie// 创建Cookie参数key、value Cookie lastTimeCookie new Cookie(lastVisitTime, 2026-03-30 14:35:56); Cookie loginTimeCookie new Cookie(loginTime, 2026-03-25 15:25:25); Cookie usernameCookie new Cookie(username, damin); // 把Cookie添加到响应发送给浏览器 resp.addCookie(lastTimeCookie); resp.addCookie(loginTimeCookie); resp.addCookie(usernameCookie);2. 获取Cookie// 从请求中获取所有Cookie Cookie[] cookies req.getCookies(); if (cookies ! null) { for (Cookie cookie : cookies) { String name cookie.getName(); // 获取Cookie的key String value cookie.getValue(); // 获取Cookie的value System.out.println(name : value); } }3. 修改CookieCookie没有专门的修改方法**同名Cookie会覆盖旧值**只需创建同名Cookie并设置新值重新添加到响应中即可覆盖原有Cookie// 创建同名Cookie设置新值 Cookie lastTimeCookie new Cookie(lastVisitTime, 2026-04-03 10:00:00); // 重新添加到响应覆盖旧Cookie resp.addCookie(lastTimeCookie);4. 设置Cookie有效期Cookie默认是**会话级Cookie**浏览器关闭就删除可以通过setMaxAge方法设置有效期单位为秒Cookie cookie new Cookie(username, damin); // 设置有效期30天 30*24*60*60 2592000秒 cookie.setMaxAge(2592000); // 补充说明0表示立即删除Cookie-1表示会话级默认值 resp.addCookie(cookie);补充Cookie 的限制大小限制单个 Cookie 最大 4KB数量限制每个域名最多 50 个 Cookie安全性Cookie 存储在客户端不可存储敏感信息如密码四、Session服务器端会话跟踪技术4.1 Session 核心概念Session是**存储在服务器端的会话对象**每个浏览器对应一个Session通过SessionID标识SessionID会自动存储在客户端的Cookie中用来在服务器端保存用户敏感数据如登录状态、用户信息。与Cookie存储在客户端不同Session的数据全部存放在服务器安全性更高且没有大小限制是处理用户敏感信息的核心方案。当浏览器第一次访问服务器时服务器会创建一个Session并生成唯一的SessionID通过Cookie发送给浏览器后续浏览器访问时会携带SessionID服务器通过该ID找到对应的Session从而获取用户的会话数据。4.2 Session 核心操作1. 获取Session对象// 获取Session不存在则创建新的常用方式 HttpSession session req.getSession(); // 获取SessionID唯一标识当前会话 String sessionId session.getId();补充req.getSession(false) 表示若Session不存在不创建新Session直接返回null。2. 向Session存数据// 存储用户数据到Session键值对形式值为Object类型 session.setAttribute(username, damin); session.setAttribute(pwd, 123456); session.setAttribute(userRole, admin); // 可存储任意对象3. 从Session取数据// 获取Session对象 HttpSession session req.getSession(); // 读取数据需强制转换类型因为存的是Object String username (String) session.getAttribute(username); String pwd (String) session.getAttribute(pwd); String userRole (String) session.getAttribute(userRole);4. Session 销毁Session有两种销毁方式手动销毁如用户退出登录和自动超时销毁服务器默认配置// 1. 手动销毁Session如退出登录功能 session.invalidate(); // 2. 设置Session超时时间单位秒默认30分钟 session.setMaxInactiveInterval(1800); // 30分钟无操作则自动销毁4.3 Cookie vs Session 核心区别特性CookieSession存储位置客户端浏览器服务器端安全性低可被篡改、窃取高数据在服务器不可直接访问存储大小小单个4KB限制大无严格限制取决于服务器内存生命周期可自定义会话级/持久化默认30分钟可手动销毁或设置超时适用场景非敏感数据如上次访问时间、记住用户名敏感数据如登录状态、用户权限、用户信息五、ServletContext 与 ServletConfigServlet 的配置对象在Servlet开发中除了请求响应对象、会话对象还有两个核心配置对象——ServletContext和ServletConfig它们分别负责全局配置和局部配置是实现Servlet参数管理、数据共享的关键工具很多初学者容易混淆两者的作用下面我们逐一拆解。5.1 ServletContext全局上下文对象核心定义每个Web应用项目在服务器启动时会创建一个唯一的ServletContext对象它是**全局共享对象**整个项目中的所有Servlet、JSP都能访问它主要用于存储全局参数、实现Servlet间的数据共享以及获取项目相关的资源信息。核心操作// 1. 获取ServletContext对象三种常用方式效果一致 ServletContext context1 this.getServletContext(); ServletContext context2 req.getServletContext(); ServletContext context3 session.getServletContext(); // 2. 设置全局共享数据所有Servlet都能访问 context1.setAttribute(totalVisit, 5); // 统计总访问量全局共享 // 3. 获取全局共享数据 Integer totalVisit (Integer) context1.getAttribute(totalVisit); resp.getWriter().write(总访问量 totalVisit); // 4. 获取web.xml中配置的全局初始化参数需在web.xml中配置 String url context1.getInitParameter(jdbcUrl);web.xml 全局参数配置示例!-- 全局初始化参数所有Servlet共享 -- context-param param-namejdbcUrl/param-name param-valuejdbc:mysql://localhost:3306/mydb/param-value /context-paramcontext-param param-namedriverClass/param-name param-valuecom.mysql.cj.jdbc.Driver/param-value /context-param5.2 ServletConfigServlet专属配置对象核心定义ServletConfig是**局部配置对象**每个Servlet在创建时都会对应一个专属的ServletConfig对象仅当前Servlet能访问主要用于存储当前Servlet的专属初始化参数实现单个Servlet的个性化配置。核心操作1. 重写init方法获取ServletConfigprivate ServletConfig sc; // 重写init方法获取当前Servlet的ServletConfig对象 Override public void init(ServletConfig config) throws ServletException { this.sc config; // 保存ServletConfig对象供后续使用 }2. web.xml中配置Servlet初始化参数servlet servlet-nameMyServlet/servlet-name servlet-classcom.example.unit2_11.MyServlet/servlet-class !-- 配置当前Servlet的专属初始化参数仅当前Servlet可用 -- init-param param-nameurl/param-name param-valuejdbc:mysql://localhost:3306/mydb/param-value /init-param init-param param-nameusername/param-name param-valueroot/param-value /init-param init-param param-namepassword/param-name param-value12345678/param-value /init-param /servlet servlet-mapping servlet-nameMyServlet/servlet-name url-pattern/MyServlet/url-pattern /servlet-mapping3. 在Servlet中获取初始化参数// 获取ServletConfig中配置的专属参数 String url sc.getInitParameter(url); String username sc.getInitParameter(username); String password sc.getInitParameter(password); // 输出参数用于后续数据库连接等操作 System.out.println(数据库地址 url); System.out.println(数据库用户名 username);5.3 ServletContext vs ServletConfig 核心区别特性ServletContextServletConfig作用范围全局整个Web应用所有Servlet共享局部仅当前Servlet可用对象数量一个Web应用只有一个每个Servlet对应一个配置位置web.xml中context-param标签web.xml中servlet标签内的init-param标签核心用途全局数据共享、获取全局配置、访问项目资源当前Servlet的专属配置、个性化参数设置六、实战完整 Servlet 登录案例结合前面所学的Cookie、Session、ServletConfig、请求响应对象等知识点我们编写一个完整的Servlet登录案例模拟用户登录校验、状态保持、页面跳转的完整流程帮助大家巩固所学理解知识点的实际应用场景。案例需求用户提交用户名和密码服务器校验通过后将用户信息存入Session用Cookie记住用户名7天有效期重定向到首页校验失败则返回登录页显示错误提示。6.1 登录Servlet完整代码WebServlet(/login) // 注解配置URL映射 public class LoginServlet extends HttpServlet { // 模拟数据库中的用户名和密码实际开发中从数据库查询 private static final String DB_USERNAME damin; private static final String DB_PASSWORD 123456; Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 设置请求和响应编码解决中文乱码问题 req.setCharacterEncoding(UTF-8); // 处理请求参数中文乱码 resp.setContentType(text/html;charsetutf-8); // 处理响应中文乱码 // 2. 获取客户端提交的请求参数用户名、密码 String username req.getParameter(username); String password req.getParameter(password); // 3. 模拟数据库校验对比提交的参数与模拟数据 if (DB_USERNAME.equals(username) DB_PASSWORD.equals(password)) { // 4. 登录成功存储用户信息到Session保持登录状态 HttpSession session req.getSession(); session.setAttribute(username, username); // 存入用户名 session.setAttribute(loginStatus, true); // 存入登录状态 // 5. 创建Cookie记住用户名有效期7天 Cookie usernameCookie new Cookie(username, username); usernameCookie.setMaxAge(7 * 24 * 60 * 60); // 7天 604800秒 resp.addCookie(usernameCookie); // 发送Cookie到浏览器 // 6. 重定向到首页避免表单重复提交地址栏改变 resp.sendRedirect(/index.jsp); } else { // 7. 登录失败存储错误提示到request域转发到登录页 req.setAttribute(msg, 用户名或密码错误请重新登录); // 转发到登录页地址栏不变可共享request域中的错误信息 req.getRequestDispatcher(/login.jsp).forward(req, resp); } } // 统一处理GET请求将GET请求转发到POST方法避免重复代码 Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }6.2 案例核心知识点应用说明请求编码设置req.setCharacterEncoding(UTF-8) 解决POST请求参数中文乱码问题Session应用存储用户登录状态和用户名确保用户在会话期间无需重复登录Cookie应用记住用户名下次访问登录页时可自动填充需在JSP页面配合获取Cookie转发与重定向失败用转发共享错误信息成功用重定向避免表单重复提交注解配置WebServlet(/login) 简化配置无需编写web.xml映射。6.3 补充登录页login.jsp简化代码% page contentTypetext/html;charsetUTF-8 languagejava % 用户登录用户登录!-- 显示错误提示登录失败时从request域获取 -- % String msg (String) request.getAttribute(msg); % % if (msg ! null) { % font colorred% msg %/font % } % !-- 表单提交到/login Servlet --七、本模块总结本模块我们聚焦Java Web的进阶核心知识点从会话跟踪技术到Servlet配置对象再到实战案例完整覆盖了“数据存储-参数配置-实际应用”的核心流程核心要点总结如下会话跟踪Cookie客户端存储非敏感数据和Session服务器存储敏感数据是解决HTTP无状态问题的核心方案两者配合使用既能实现状态保持又能保证数据安全需牢记两者的区别与适用场景。Servlet配置对象ServletContext全局共享管理全局参数和资源和ServletConfig局部专属配置单个Servlet参数明确两者的作用范围和使用场景避免混淆。实战核心请求响应对象、Cookie、Session、转发/重定向的综合应用是Java Web开发的基础能力登录案例完整演示了这些知识点的联动掌握该案例就能应对简单的Web交互场景。至此Java Web的核心基础知识点Tomcat、Servlet、会话跟踪、配置对象已全部讲解完毕这些知识点是后续学习Filter、Listener、SpringMVC等框架的底层基础建议多动手编写代码熟练掌握各对象的核心操作真正做到融会贯通。