Java第24课:会话技术CookieSession

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

一、核心概念

  1. Cookie

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

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

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

项目新增 4 个 Servlet: CookieDemo、GetCookie、SessionDemo、GetSession

① 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 登录离不了!

相关推荐
IT研究室5 分钟前
最新计算机毕业设计选题推荐-基于spring boot的教育学习平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
亚林瓜子7 分钟前
Spring Boot 集成 ip2region 离线 IP 库实战指南
java·spring boot·后端·ip·ip2region
Want59515 分钟前
Python太极八卦图
开发语言·python
饕餮争锋26 分钟前
python开发工具uv简介
开发语言·python·uv
盛世宏博智慧档案34 分钟前
恒湿净化一体机联动开发:档案馆温湿度阈值判断与启停控制实践
java·后端·struts·恒湿机·加湿除湿消毒净化一体机
奇树谦36 分钟前
LRU 缓存原理与 C++ 实践示例
开发语言·c++·缓存
toooooop838 分钟前
FastAdmin Hook 机制与插件错误透传:`$result` 之外的信封
开发语言·fastadmin
vipxieliang42 分钟前
ValidX 应用于 HR系统员工信息验证:入职、离职、社保数据
java·spring boot·后端
huaweichenai1 小时前
spring boot实现base64上传
java·spring boot·后端
萧瑟余晖1 小时前
Spring Web综合实战与性能调优详解
java·spring