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

相关推荐
她的男孩7 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
荣码9 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev11 小时前
Gson → kotlinx.serialization
android·java·kotlin
小bo波19 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯21 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
SamDeepThinking1 天前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好1 天前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng1 天前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端