Salmon的全栈知识 Salmon的全栈知识
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
npm

(进入注册为作者充电)

  • JUnit单元测试
  • JDBC
  • JDBC连接池&JDBCTemplate
  • XML
  • Tomcat&Servlet
  • Servlet&HTTP&Request
  • Response
  • Cookie&Session
    • 会话(Session)
    • Cookie(客户端会话技术)
      • 1. 概念
      • 2. 快速入门
      • 3. 实现原理
      • 4. Cookie 细节
      • (1)是否可以发送多个 cookie?
      • (2)Cookie 在浏览器中保存多久?
      • (3)能否存中文?
      • (4)Cookie 共享问题
      • 5. Cookie 特点与作用
      • 6. 案例:记住上次访问时间
      • 需求:
      • 分析:
      • 实现代码:
    • JSP 入门学习
      • 1. 概念
      • 2. 原理
      • 3. JSP 脚本元素
      • 4. JSP 内置对象
    • Session(服务器端会话技术)
      • 1. 概念
      • 2. 快速入门
      • 3. 原理
      • 4. 细节
      • 5. 特点
      • Cookie vs Session
    • 案例:验证码登录
      • 1. 需求
      • 2. 分析
  • EL&JSTL
  • Filter&Listener
  • 《JavaWeb》笔记
Salmon
2025-07-21
目录

Cookie&Session

# 会话(Session)

  1. 会话:一次会话中包含多次请求和响应。
    • 一次会话:浏览器第一次向服务器发送请求会话建立,直到有一方断开为止。
  2. 作用:一次会话内的多次请求间,共享数据。
  3. 方式:
    • 客户端会话技术:Cookie
    • 服务器端会话技术:Session

# Cookie(客户端会话技术)

# 1. 概念

将数据保存到客户端浏览器中。

# 2. 快速入门

使用步骤:

  1. 创建 Cookie 对象,绑定数据
new Cookie(String name, String value);
  1. 发送 Cookie 对象
response.addCookie(Cookie cookie);
  1. 获取 Cookie,拿到数据
Cookie[] cookies = request.getCookies();

# 3. 实现原理

基于响应头 Set-Cookie 与请求头 Cookie 实现。

# 4. Cookie 细节

# (1)是否可以发送多个 cookie?

  • 可以,创建多个 Cookie 对象,调用多次 addCookie 即可。

# (2)Cookie 在浏览器中保存多久?

  • 默认:浏览器关闭后销毁。
  • 设置持久化:
cookie.setMaxAge(int seconds);
  • 正数:写入硬盘文件,指定有效期;
  • 负数:默认值(关闭浏览器销毁);
  • 0:删除 cookie。

# (3)能否存中文?

  • Tomcat8 之前:不支持,需 URL 编码;
  • Tomcat8 之后:支持中文,但不支持特殊字符,建议仍使用 URL 编码。

# (4)Cookie 共享问题

  • 同一 Tomcat 多 Web 项目之间

    • 默认不能共享;
    • 通过 setPath("/") 设置作用路径可共享。
  • 不同 Tomcat 服务器之间

    • 设置 setDomain(".baidu.com"),如:
      • tieba.baidu.com
      • news.baidu.com
    • 一级域名相同,可共享 Cookie。

# 5. Cookie 特点与作用

  • 特点:
    • 存在客户端;
    • 单个大小限制(4KB),总数限制(20个);
  • 作用:
    • 存储少量非敏感数据;
    • 无需登录识别客户端身份。

# 6. 案例:记住上次访问时间

# 需求:

  1. 第一次访问:提示“您好,欢迎您首次访问。”
  2. 再次访问:提示“欢迎回来,您上次访问时间为…”

# 分析:

使用 Cookie,判断是否存在 lastTime。

# 实现代码:

@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        Cookie[] cookies = request.getCookies();
        boolean flag = false;

        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if ("lastTime".equals(name)) {
                    flag = true;

                    // 获取当前时间
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date = sdf.format(date);
                    str_date = URLEncoder.encode(str_date, "utf-8");

                    // 更新 Cookie
                    cookie.setValue(str_date);
                    cookie.setMaxAge(60 * 60 * 24 * 30); // 一个月
                    response.addCookie(cookie);

                    // 获取并解码 Cookie
                    String value = URLDecoder.decode(cookie.getValue(), "utf-8");
                    response.getWriter().write("\<h1>欢迎回来,您上次访问时间为:" + value + "\</h1>");
                    break;
                }
            }
        }

        if (!flag) {
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String str_date = URLEncoder.encode(sdf.format(date), "utf-8");

            Cookie cookie = new Cookie("lastTime", str_date);
            cookie.setMaxAge(60 * 60 * 24 * 30);
            response.addCookie(cookie);

            response.getWriter().write("\<h1>您好,欢迎您首次访问\</h1>");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }
}

# JSP 入门学习

# 1. 概念

  • Java Server Pages:特殊的页面,支持 HTML 与 Java 代码混写。

# 2. 原理

  • JSP 本质是 Servlet。

# 3. JSP 脚本元素

语法 说明
<% 代码 %> 写在 service 方法中
<%! 代码 %> 写在类成员位置
<%= 代码 %> 作为输出内容显示在页面中

# 4. JSP 内置对象

JSP 提供 9 个内置对象,常用的包括:

  • request
  • response
  • out:字符输出流(out.write())

注意:response.getWriter() 输出优先级高于 out.write()。

# Session(服务器端会话技术)

# 1. 概念

  • 使用服务器端 HttpSession 对象保存数据,支持会话期间共享。

# 2. 快速入门

HttpSession session = request.getSession();
session.setAttribute("key", value);
Object value = session.getAttribute("key");
session.removeAttribute("key");

# 3. 原理

  • 底层通过 Cookie 存储 JSESSIONID 实现。

# 4. 细节

  1. 客户端关闭、服务器不关闭 → 默认不是同一个 Session
    • 解决方法:
Cookie c = new Cookie("JSESSIONID", session.getId());
c.setMaxAge(60 * 60); // 1小时
response.addCookie(c);
  1. 服务器关闭、客户端不关闭
  • 默认不是同一个;
  • Tomcat 会:
    • 钝化(持久化):关闭前序列化到硬盘;
    • 活化(恢复):重启时恢复 session 对象。
  1. 销毁时机
  • 服务器关闭;
  • session.invalidate();
  • 默认 30 分钟无操作失效,可在 web.xml 中配置:
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

# 5. 特点

  • 数据存在服务器,支持任意类型/大小;
  • 更安全,无数量和大小限制。

# Cookie vs Session

对比项 Cookie Session
存储位置 客户端 服务器端
数据大小 最大 4KB 单个,20 个总数限制 理论无限制
安全性 低,易被篡改 高,不易篡改

# 案例:验证码登录

# 1. 需求

用户访问 login.jsp,输入用户名、密码、验证码。

  • 验证码错误 → 返回登录页面,提示“验证码错误”
  • 用户名/密码错误 → 返回登录页面,提示“用户名或密码错误”
  • 全部正确 → 跳转至 success.jsp,提示“用户名,欢迎您”

# 2. 分析

验证码保存到 Session 中,登录时进行校验。

上次更新: 2025/07/23, 01:37:33
Response
EL&JSTL

← Response EL&JSTL→

Theme by Vdoing | Copyright © 2022-2025 Salmon's Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式