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·大数据·word·powerpoint·.net
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++