编程自学指南:java程序设计开发,会话管理(Cookie/Session)基础, Cookie 和 Session 的工作原理与适用场景,会话管理的核心价值:跨请求保持状态

编程自学指南:java程序设计开发,会话管理(Cookie/Session)基础课件

一、课程信息

学习目标

  1. 理解会话管理的核心价值跨请求保持状态
  2. 掌握 Cookie 和 Session 的工作原理适用场景
  3. 能在项目中手写实现记住用户名、购物车等功能
  4. 理解其与 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 计数器

任务

  1. 使用 Cookie 记录用户访问次数
  2. 每次访问页面时显示:您已访问本页面 3 次

练习 2:Session 域实验

任务

  1. 在 A.jsp 中向 Session 存入数据
  2. 在 B.jsp 中读取该数据
  3. 关闭浏览器后再次访问 B.jsp,观察结果

九、课程总结

知识图谱:

会话管理  
   ↳ Cookie:  
      ✅ 创建/读取/删除  
      ✅ 有效期/路径/安全设置  
   ↳ Session:  
      ✅ 创建/获取/销毁  
      ✅ 存储用户状态  
   ↳ 核心案例:  
      ✅ 记住用户名(Cookie)  
      ✅ 登录状态(Session)  

口诀记忆:

“Cookie 存客户端,大小安全要注意,
Session 放服务器,依赖 ID 来传递,
登录购物车用 Session,记住密码用 Cookie,
会话管理很重要,状态保持离不了!”

十、课后作业

必做 1:简易购物车

要求

  1. 使用 Session 实现购物车功能
  2. 支持添加商品、显示购物车列表、清空购物车

必做 2:Cookie 加密存储

任务

  1. 对 Cookie 中的用户名进行加密
  2. 使用 Base64 或 AES 算法实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zl515035644

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值