Servlet 会话与四大核心技术详解

(Cookie、Session、ServletContext、ServletConfig)含原理图解、作用、生命周期、常用方法、使用步骤、区别对比,适合考试 + 作业 + 面试背诵。


一、前提:会话概念

1. 什么是会话

一次会话:浏览器第一次访问服务器开始,直到浏览器关闭为止,期间所有多次请求,属于同一次会话

2. 为什么需要会话技术

HTTP 协议是无状态的:每次请求都是独立的,服务器不会记住上一次用户信息。→ 用 Cookie、Session 保存用户状态、登录信息、购物车等。

3. 会话技术分类

  1. 客户端会话技术Cookie(数据存在浏览器)
  2. 服务端会话技术Session(数据存在服务器)

二、Cookie 详解

1. 原理图解

  1. 服务器创建 Cookie → 响应头带回浏览器
  2. 浏览器保存 Cookie
  3. 下次访问自动携带 Cookie 请求服务器

2. 作用

  • 少量数据保存在客户端浏览器
  • 记住用户名、免登录、浏览记录
  • 存储文本、字符串,大小有限

3. 常用 API & 使用步骤

① 创建 Cookie

java

运行

Cookie cookie = new Cookie("username","zhangsan");

② 设置存活时间

java

运行

cookie.setMaxAge(60*60*24);  // 单位:秒
// 正数:持久化保存
// 负数:浏览器关闭自动删除(默认)
// 0:立即删除Cookie

③ 发送 Cookie 到浏览器

java

运行

response.addCookie(cookie);

④ 服务器获取 Cookie

java

运行

Cookie[] cookies = request.getCookies();
if(cookies != null){
    for (Cookie c : cookies) {
        String name = c.getName();
        String value = c.getValue();
    }
}

4. Cookie 特点

  1. 存在浏览器端,不安全
  2. 只能存字符串,容量小
  3. 可被禁用、清除
  4. 不能存中文(需编码解码)

三、HttpSession 详解

1. 原理

  1. 第一次请求:服务器创建 Session,生成唯一 JSESSIONID
  2. JSESSIONID 通过 Cookie 发给浏览器
  3. 浏览器下次请求携带 JSESSIONID
  4. 服务器根据 ID 找到用户的 Session

2. 作用

  • 服务端保存用户数据
  • 存放登录状态、会员信息、购物车
  • 安全性高,大小无限制

3. 常用 API

① 获取 Session 对象

java

运行

// 没有就新建,有就获取
HttpSession session = request.getSession();

② 域对象:存 / 取 / 删数据

java

运行

// 存
session.setAttribute("user", "张三");
// 取
Object user = session.getAttribute("user");
// 删
session.removeAttribute("user");

③ 销毁 & 有效期

java

运行

// 手动销毁会话
session.invalidate();

// 设置空闲过期时间(秒)
session.setMaxInactiveInterval(30*60);

4. Session 生命周期

  1. 创建:第一次调用 getSession()
  2. 存活:浏览器不关闭、无超时
  3. 销毁
  • 手动 invalidate()
  • 超时自动销毁
  • 服务器正常关闭

5. Cookie 与 Session 区别

表格

对比CookieSession
存储位置浏览器客户端服务器端
安全性低,易篡改
存储内容小、字符串任意对象、大数据
生命周期可手动设置依赖会话 + 超时
依赖关系独立依赖 Cookie (JSESSIONID)

四、ServletContext 全局域对象

1. 概述

  • 全局唯一:一个项目只有一个 ServletContext
  • 服务器启动创建,服务器关闭销毁
  • 俗称:全局上下文对象

2. 作用

  1. 整个项目共享数据(所有用户、所有 Servlet 共享)
  2. 获取项目全局配置参数
  3. 获取项目资源真实路径

3. 获取方式

java

运行

//方式1
ServletContext context = getServletContext();
//方式2
ServletContext context = request.getServletContext();

4. 核心方法

① 全局域存取值

java

运行

context.setAttribute("globalMsg","全局数据");
context.getAttribute("globalMsg");

② 获取项目真实路径

java

运行

String path = context.getRealPath("/");

③ 获取全局配置参数

java

运行

String value = context.getInitParameter("key");

5. 生命周期

  • 服务器启动 → 创建
  • 服务器关闭 → 销毁

五、ServletConfig 对象

1. 作用

代表 单个 Servlet 的配置对象用来获取当前 Servlet 的局部初始化参数

2. 获取方式

java

运行

ServletConfig config = getServletConfig();

3. 常用方法

java

运行

//获取当前servlet名称
String servletName = config.getServletName();

//获取当前servlet局部初始化参数
String value = config.getInitParameter("key");

4. 特点

  1. 每个 Servlet 独有一个 ServletConfig
  2. 只作用于当前 Servlet
  3. 配置写在 web.xml/ @WebServlet 注解内

六、四大域对象 完整对比

四个域:

  1. PageContext:页面范围(JSP)
  2. HttpServletRequest:一次请求范围
  3. HttpSession:一次会话范围
  4. ServletContext:整个项目全局范围

表格

域对象范围生命周期适用场景
request一次请求请求结束销毁转发传参
session一次会话浏览器关闭 / 超时登录、购物车
servletContext整个项目服务器启停全局共享、网站统计
servletConfig单个 ServletServlet 启停读取局部配置

七、完整使用代码示例

1. Cookie 示例

java

运行

//创建
Cookie cookie = new Cookie("nickname","test");
cookie.setMaxAge(1000);
response.addCookie(cookie);

2. Session 示例

java

运行

HttpSession session = request.getSession();
session.setAttribute("loginUser","admin");

3. ServletContext 示例

java

运行

ServletContext app = getServletContext();
app.setAttribute("count",100);

4. ServletConfig 示例

java

运行

ServletConfig config = getServletConfig();
String info = config.getInitParameter("info");

八、极简总结

  1. Cookie:客户端存数据,不安全,小数据
  2. Session:服务端存数据,安全,依赖 Cookie,存登录信息
  3. ServletContext:全局唯一,项目共享,服务器启停
  4. ServletConfig:单个 Servlet 专属,读取局部配置
  5. 域范围从小到大:request < session < servletContext
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐