Java第24课:会话技术CookieSession

Web 中会话 指:浏览器和服务器之间一次连续的交互过程 。 HTTP 协议是无状态 的,服务器不会记住上一次访问的用户信息,CookieSession 就是用来保存用户状态、记录数据的核心技术,登录、记住密码、购物车都靠它们。

一、核心概念

  1. Cookie

    • 数据保存在客户端(浏览器)
    • 存储少量文本数据,不安全、有大小 / 数量限制
    • 随请求自动发送给服务器
  2. Session

    • 数据保存在服务端(Tomcat)
    • 安全、可存复杂数据,依赖 Cookie 传递 SessionID
    • 每个浏览器对应独立 Session

二、完整案例(沿用现有项目)

项目新增 4 个 Servlet: CookieDemoGetCookieSessionDemoGetSession

① CookieDemo.java(创建 & 发送 Cookie)

java运行

复制代码
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class CookieDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        // 1. 创建Cookie对象:name=value
        Cookie cookie = new Cookie("username", "zhangsan");
        // 2. 设置Cookie存活时间(单位:秒),-1 浏览器关闭就失效
        cookie.setMaxAge(60 * 10); // 存活10分钟
        // 3. 把Cookie响应给浏览器
        response.addCookie(cookie);

        PrintWriter out = response.getWriter();
        out.write("Cookie 已下发,<a href='getCookie'>点击查看Cookie</a>");
        out.close();
    }
}
② GetCookie.java(获取 Cookie)

java运行

复制代码
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class GetCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 1. 获取浏览器携带的所有Cookie数组
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for (Cookie c : cookies) {
                String name = c.getName();
                String value = c.getValue();
                out.write(name + " = " + value + "<br>");
            }
        }else{
            out.write("暂无Cookie");
        }
        out.close();
    }
}

2. Session 演示代码

① SessionDemo.java(存数据到 Session)

java运行

复制代码
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

public class SessionDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 1. 获取当前会话Session,没有则自动创建
        HttpSession session = request.getSession();
        // 2. 向Session存入数据(键值对)
        session.setAttribute("nickname", "小李");
        session.setAttribute("age", 20);

        out.write("数据已存入Session <br>");
        out.write("<a href='getSession'>点击读取Session数据</a>");
        out.close();
    }
}
② GetSession.java(读取 Session 数据)

java运行

复制代码
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

public class GetSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 获取同一次会话的Session
        HttpSession session = request.getSession();
        // 读取数据
        String nickname = (String) session.getAttribute("nickname");
        Integer age = (Integer) session.getAttribute("age");

        out.write("昵称:" + nickname + "<br>");
        out.write("年龄:" + age + "<br>");

        // 手动销毁Session(退出登录常用)
        // session.invalidate();
        out.close();
    }
}

三、配置 web.xml

追加映射配置:

xml

复制代码
<!-- Cookie 演示 -->
<servlet>
    <servlet-name>CookieDemo</servlet-name>
    <servlet-class>CookieDemo</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CookieDemo</servlet-name>
    <url-pattern>/cookieDemo</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>GetCookie</servlet-name>
    <servlet-class>GetCookie</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>GetCookie</servlet-name>
    <url-pattern>/getCookie</url-pattern>
</servlet-mapping>

<!-- Session 演示 -->
<servlet>
    <servlet-name>SessionDemo</servlet-name>
    <servlet-class>SessionDemo</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SessionDemo</servlet-name>
    <url-pattern>/sessionDemo</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>GetSession</servlet-name>
    <servlet-class>GetSession</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>GetSession</servlet-name>
    <url-pattern>/getSession</url-pattern>
</servlet-mapping>

四、测试步骤

  1. 编译 .java 文件,class 放入 WEB-INF/classes,重启 Tomcat
  2. 测试 Cookie
    • 访问 http://localhost:8080/FirstWeb/cookieDemo 下发 Cookie
    • 点击链接查看 getCookie 页面,读出数据
  3. 测试 Session
    • 访问 http://localhost:8080/FirstWeb/sessionDemo 存入数据
    • 点击链接读取 Session 内容

五、核心知识点总结

  • new Cookie(name,value):创建 Cookie
  • setMaxAge(秒):设置有效期
  • response.addCookie(cookie):发送 Cookie 到浏览器
  • request.getCookies():获取所有 Cookie 数组

2. Session 常用方法

  • request.getSession():获取 / 创建会话对象
  • setAttribute(key,value):存数据
  • getAttribute(key):取数据
  • invalidate()销毁会话(退出登录)

表格

对比项 Cookie Session
存储位置 客户端浏览器 服务端服务器
安全性 低,可篡改
数据类型 仅字符串 任意对象
生命周期 可手动设置 默认超时失效
依赖 依赖 Cookie 传递 SessionID

4. 典型使用场景

  • Cookie:记住用户名、免密登录(短期)
  • Session:保存登录用户信息、购物车、权限数据

六、记忆口诀

Cookie 存浏览器,明文数据不安全; Session 放服务器,登录状态最常用; 会话跟踪两大件,Web 登录离不了!

相关推荐
神明不懂浪漫32 分钟前
【第七章】Java中的常用类
java·开发语言·前端·经验分享·笔记
程序喵大人9 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng9 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena1577958579210 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
wdfk_prog10 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕11 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫11 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通11 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦12 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
AI多Agent协作实战派13 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug