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

相关推荐
小小编程路1 小时前
字符串转数字时,可能会遇到哪些问题?
java·开发语言·算法
许彰午1 小时前
责任链模式实战——同一个框架里的两种链
java·开发语言·责任链模式
寻道码路1 小时前
LangChain4j Java AI 应用开发实战(十四):手写 RAG 全流程 - 深入理解每个环节
java·开发语言·人工智能·ai
云烟成雨TD2 小时前
Agent Scope Java 2.x 系列【1】核心架构
java·人工智能·agent
愛~杦辷个訾2 小时前
Java Springboot使用阿里云oss对图片进行等质量压缩,转换成webp格式的压缩图。
java·spring boot·阿里云·oss
吴阿福|一人公司2 小时前
Python 类变量修改的压力测试:高并发场景
开发语言·python
天天进步20152 小时前
Tunnelto 源码解析 #13:自托管部署:Docker、环境变量、端口规划与单实例限制
开发语言
AI科技星2 小时前
第三卷:质数王朝志(全卷定稿)
c语言·开发语言·汇编·electron·概率论
霸道流氓气质2 小时前
Spring Boot Multipart 表单中文乱码问题全解析
java·spring boot·后端