编程自学指南:java程序设计开发,会话管理(Cookie/Session)基础课件
一、课程信息
学习目标
- 理解会话管理的核心价值:跨请求保持状态
- 掌握 Cookie 和 Session 的工作原理与适用场景
- 能在项目中手写实现记住用户名、购物车等功能
- 理解其与 Servlet/Filter 的协作关系
二、课程导入:生活中的会话管理
🌰 超市购物场景类比
技术 | 生活案例 | 作用描述 |
---|---|---|
Cookie | 超市购物小票 | 客户端存储少量信息(如优惠码) |
Session | 超市储物柜(凭票领取) | 服务器端存储大量信息(商品) |
三、Cookie 详解
🔍 1. 核心概念
- 定义:
Cookie 是服务器发送到客户端并存储在浏览器中的小块数据,用于在多次请求间保持状态 - 特点:
✅ 存储在客户端(浏览器 / 本地文件)
✅ 自动随请求发送(同一域名下)
✅ 单个 Cookie 大小限制:4KB
🔥 2. 操作 Cookie 实战
✅ 创建并发送 Cookie
@WebServlet("/setCookie")
public class CookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1. 创建 Cookie(键值对)
Cookie usernameCookie = new Cookie("username", "john");
// 2. 设置有效期(秒),-1 表示会话级(浏览器关闭即失效)
usernameCookie.setMaxAge(24 * 60 * 60); // 24小时
// 3. 设置有效路径(默认当前路径)
usernameCookie.setPath("/");
// 4. 添加到响应
resp.addCookie(usernameCookie);
resp.getWriter().write("Cookie 设置成功");
}
}
✅ 读取 Cookie
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
resp.getWriter().write("欢迎回来," + cookie.getValue());
return;
}
}
}
resp.getWriter().write("未检测到 Cookie");
}
}
🔧 3. 中文处理与安全设置
// 中文编码(URL 编码)
String encodedName = URLEncoder.encode("张三", "UTF-8");
Cookie cookie = new Cookie("username", encodedName);
// 安全设置(防止 XSS 攻击)
cookie.setHttpOnly(true); // 禁止 JavaScript 访问
cookie.setSecure(true); // 仅 HTTPS 传输
四、Session 详解
🔍 1. 核心概念
- 定义:
Session 是服务器端为每个用户创建的会话对象,通过会话 ID(JSESSIONID) 与客户端关联 - 特点:
✅ 存储在服务器端
✅ 数据量无限制(受内存限制)
✅ 依赖 Cookie 或 URL 重写传递会话 ID
🔥 2. 操作 Session 实战
✅ 创建 Session 并存储数据
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String username = req.getParameter("username");
// 1. 获取或创建 Session(第一次调用时创建)
HttpSession session = req.getSession();
// 2. 存储数据到 Session
session.setAttribute("user", username);
resp.sendRedirect("/home.jsp");
}
}
✅ 读取 Session 数据
@WebServlet("/home")
public class HomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = req.getSession(false); // 不创建新 Session
if (session != null && session.getAttribute("user") != null) {
resp.getWriter().write("欢迎登录," + session.getAttribute("user"));
} else {
resp.sendRedirect("/login.jsp");
}
}
}
✅ 销毁 Session
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = req.getSession(false);
if (session != null) {
session.invalidate(); // 销毁 Session
}
resp.sendRedirect("/login.jsp");
}
}
五、Cookie vs Session 对比
六、实战案例:记住用户名与购物车
🔥 案例 1:记住用户名(Cookie)
登录页(login.jsp)
<input type="checkbox" name="remember" value="true"> 记住我
Servlet 处理
if ("true".equals(remember)) {
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(7 * 24 * 60 * 60); // 7天
resp.addCookie(cookie);
}
🔥 案例 2:购物车(Session)
// 添加商品到购物车
HttpSession session = req.getSession();
List<String> cart = (List<String>) session.getAttribute("cart");
if (cart == null) {
cart = new ArrayList<>();
session.setAttribute("cart", cart);
}
cart.add(productId);
七、关联知识:会话管理与其他技术
🔗 1. 与 Filter 的协作(权限控制)
@WebFilter("/admin/*")
public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
((HttpServletResponse) res).sendRedirect("/login.jsp");
return;
}
chain.doFilter(req, res);
}
}
🔗 2. 与 Spring MVC 的集成
@Controller
@RequestMapping("/cart")
public class CartController {
@PostMapping("/add")
public String addToCart(@RequestParam String productId,
HttpSession session) {
List<String> cart = (List<String>) session.getAttribute("cart");
cart.add(productId);
return "redirect:/cart/list";
}
}
八、课堂练习
练习 1:Cookie 计数器
任务:
- 使用 Cookie 记录用户访问次数
- 每次访问页面时显示:
您已访问本页面 3 次
练习 2:Session 域实验
任务:
- 在
A.jsp
中向 Session 存入数据 - 在
B.jsp
中读取该数据 - 关闭浏览器后再次访问
B.jsp
,观察结果
九、课程总结
知识图谱:
会话管理
↳ Cookie:
✅ 创建/读取/删除
✅ 有效期/路径/安全设置
↳ Session:
✅ 创建/获取/销毁
✅ 存储用户状态
↳ 核心案例:
✅ 记住用户名(Cookie)
✅ 登录状态(Session)
口诀记忆:
“Cookie 存客户端,大小安全要注意,
Session 放服务器,依赖 ID 来传递,
登录购物车用 Session,记住密码用 Cookie,
会话管理很重要,状态保持离不了!”
十、课后作业
必做 1:简易购物车
要求:
- 使用 Session 实现购物车功能
- 支持添加商品、显示购物车列表、清空购物车
必做 2:Cookie 加密存储
任务:
- 对 Cookie 中的用户名进行加密
- 使用 Base64 或 AES 算法实现