Cookie 浏览器数据存储技术


Cookie

1. 会话的概述

a. 什么是会话?

  • 日常生活中:从拨通电话到挂断电话之间的一连串你问我答的过程就是一个会话。
  • B/S 架构中:从浏览器第一次给服务器发送请求时,建立会话;直到有一方断开,会话结束。
  • 一次会话:包含多次请求响应。浏览器与服务器建立连接,其中可以存在多次的请求,一直到有一方停止,会话才结束。

b. 会话技术

  • HTTP(超文本传输协议)是一个无状态协议,同一个会话的连续两个请求相互独立,彼此并不了解。
  • 会话技术:用于存储浏览器与服务器在请求和响应过程中产生的数据
    • Cookie:客户端会话技术,数据是保存在浏览器上;
    • Session:服务器端会话技术, 数据是保存在服务器上。

2. Cookie 的概述

  • Cookie 的作用:在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)

3. 存储与获得 Cookie

a. 设置数据到 Cookie 中

  1. 创建 Cookie 对象,设置数据:
    Cookie cookie = new Cookie(String name,String value);
  2. 通过 Response,响应(返回)Cookie:
    response.addCookie(cookie);

b. 从 Cookie 中获取数据

  1. 通过 Request 对象,接收 Cookie 数组(即获取所有的 Cookie):
    Cookie[] cookies = request.getCookies();
  2. 遍历数组:
        if(cookies!=null){
            for (Cookie c : cookies) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name + " : " + value);
            }
        }

c. 代码示例

  • SetServlet:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/SetServlet")
public class SetServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.创建Cookie对象,设置数据
        Cookie cookie = new Cookie("name", "Regino");
        // 2.通过Response,响应(返回)Cookie
        response.addCookie(cookie);
    }
}
  • GetServlet:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/GetServlet")
public class GetServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.通过Request对象,接收Cookie数组
        Cookie[] cookies = request.getCookies();
        // 2.遍历数组
        if (cookies != null) {
            for (Cookie c : cookies) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name + " : " + value);
            }
        }
    }
}

4. Cookie 的工作原理

  • 基于 HTTP 协议:请求头 Cookie 和 响应头 set-cookie。
  • 第一次请求,服务器返回响应头,其中一行:Set-Cookie: name=Regino,向浏览器存储 Cookie;
    在这里插入图片描述
  • 第二次请求,服务器获得请求头,其中一行:Cookie: name=Regino,从浏览器的 Cookie 空间中获得 Cookie。
    在这里插入图片描述

a. 查看 Cookie

b. Cookie 的用途

  • 访问 jd.com,调出 Cookie:
    在这里插入图片描述
  • 这些 Cookie 用来保存历史浏览记录(不需要在登录状态下也会记录,比如 youku 这些视频网站不需要登录也能看到上次浏览的信息),具体的用途由开发者设定。

5. Cookie 的常用 API

a. 服务器发送多个 Cookie

  1. 创建多个 Cookie 对象:
Cookie cookie1 = new Cookie("name","Regino");
Cookie cookie2 = new Cookie("age","23");
  1. 通过 Response 响应多个:
response.addCookie(cookie1);
response.addCookie(cookie2);
  • MultipleCookie:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/MultipleCookie")
public class MultipleCookie extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 创建多个Cookie对象
        Cookie cookie1 = new Cookie("name","Regino");
        Cookie cookie2 = new Cookie("age","23");
        // 2. 通过Response响应多个
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}

b. Cookie 在浏览器保存时间

  • 默认情况下:
    浏览器关闭(即会话结束)后,Cookie 立即销毁。(Cookie 在浏览器内存中存储)
  • 设置 Cookie 的存活时间
    cookie.setMaxAge(int second);,单位是秒
    • 正数:指定存活时间,持久化浏览器的磁盘中,到期后自动销毁
    • 负数:默认浏览器关闭,Cookie 销毁
    • 零:立即销毁(Cookie 的自杀)
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/MaxAgeCookie")
public class MaxAgeCookie extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.创建Cookie对象
        Cookie cookie = new Cookie("name", "Regino");
        
        // 2.设置Cookie存活时间
        // cookie.setMaxAge(-1); // 默认值,浏览器关闭自动销毁
        // cookie.setMaxAge(60);// 存活60秒,到期自动销毁
        cookie.setMaxAge(0); // 立即销毁...

        //3. Response响应Cookie
        response.addCookie(cookie);
    }
}
  • Cookie 的有效时间要根据具体的业务而决定的,并是不是越长越好。例如,存储的用户密码如果存在时间太长会不安全,所以现在大多只能自动保存 7 天。

c. Cookie 存储中文

  • Tomcat 8 之前的版本,不支持中文。可以用万能方案,JDK 提供了两个类专门解决编解码的问题:
    URLEncoder 编码
    URLDecoder 解码
  • Tomcat 8 以后的版本,支持中文。
    Rfc6265Cookie 规范(Cookie 通信规范):不允许使用分号、空格、逗号等一些特殊符号。
  • EncodeCookie:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.net.URLEncoder;

@WebServlet("/EncodeCookie")
public class EncodeCookie extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String product = "华为荣耀 30X,";
        product = URLEncoder.encode(product, "UTF-8");

        // 1.创建Cookie对象
        Cookie cookie = new Cookie("product", product);
        // 2.Response响应Cookie
        response.addCookie(cookie);
    }
}

  • GetCookie:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.net.URLDecoder;

@WebServlet("/GetCookie")
public class GetCookie extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.通过Request对象,接收Cookie数组
        Cookie[] cookies = request.getCookies();
        // 2.遍历数组
        if(cookies!=null){
            for (Cookie c : cookies) {
                String name = c.getName();
                String value = c.getValue();
                // 解码
                value = URLDecoder.decode(value, "UTF-8");
                System.out.println(name + " : " + value);
            }
        }
    }
}

d. Cookie 共享数据的范围

i. 在一个 Tomcat 服务器中,部署了多个 web 项目,那么这些 web 项目的 Cookie 能否共享?

  • 默认情况下不可以共享。
    默认 Cookie 的携带路径,是当前设置 Cookie 的 Serlvet 父路径。例如:
    • 设置 Cookie:http://localhost:8080/webappPractice2/EncodeCookie
    • 默认携带路径:http://localhost:8080/webappPractice2
  • 但是可以通过指定 Cookie 的携带路径(Path)共享:cookie.setPath(String path);。例如:cookie.setPath("/");/ 相当于 http://localhost:8080/

ii. 能否跨父路径读取 Cookie 数据?

  • 设置 Cookie:http://localhost:8080/webappPractice2/a/SetCookie
  • 接收 Cookie:http://localhost:8080/webappPractice2/b/GetCookie
  • 默认情况下,是否能获取 a 目录下的 Cookie 数据?
  • 答案是不可以。但是可以在当前项目下共享 Cookie:cookie.setPath("/项目名")
  • PathCookie:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.net.URLEncoder;

@WebServlet("/PathCookie")
public class PathCookie extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String product = "小米10";
        
        product = URLEncoder.encode(product, "UTF-8");

        // 1.创建Cookie对象
        Cookie cookie = new Cookie("product", product);
        // 2.设置Cookie的携带路径
        cookie.setPath("/");
        // 3.Response响应Cookie
        response.addCookie(cookie);
    }
}

iii. 不同 Tomcat 服务器之间 Cookie 能否共享?

  • 默认情况下不可以。
  • 多个服务器之间的数据共享 Cookie,需要在同一个一级域名下。设置域名调用方法:cookie.setDomain(".jd.com")
    在这里插入图片描述

6. 删除 Cookie

  • 一个 Cookie 同名不同 Path 可以存在多个, 一个 Cookie 的唯一标识是 Path + 名字
  • 删除指定 Cookie 的要素:
    • Cookie 必须同名;
    • Path 要一致;
    • 有效时间为 0;
    • response.addCookie(cookie); 重新覆盖。

a. 存储 Cookie

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//往Cookie存储值
@WebServlet("/setCookie")
public class SetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("username", "哈哈Regino");
        cookie.setPath("/webappPractice2/getCookie"); //设置有效路径
        cookie.setMaxAge(60 * 60 * 24); //1天
        //发送Cookie
        response.addCookie(cookie);
    }

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

b. 获取 Cookie

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //获取所有的Cookie,并且输出
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("username")) {
                    System.out.println("username : " + cookie.getValue());
                }else {
                    System.out.println("其他Cookie");
                }
            }
        } else {
            System.out.println("所有Cookie已清空");
        }
    }

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

c. 删除指定 Cookie

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/removeCookie")
public class RemoveCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("username", "");
        cookie.setPath("/webappPractice2/getCookie");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
    }

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

d. 删除指定目录下所有 Cookie

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/removeAllCookie")
public class RemoveAllCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for (Cookie c : cookies) {
                c.setMaxAge(0);
            }
        }
    }

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

e. 测试

7. Cookie 的特点

  1. Cookie 存储数据都在客户端(浏览器);
  2. Cookie 的存储数据只能是字符串;
  3. Cookie 单个大小不能超过 4KB;
  4. 同一个域名下 Cookie 数量不能超过 50 个;
  5. Cookie 路径不同,可以重名出现;
  6. Cookie 存储的数据不太安全。Cookie 的安全是指不会联系到浏览器的主机上的其他信息,不安全是指在客户端可以被其他用户看到 Cookie 保存的内容。
  • 不同浏览器间同一域名下 Cookie 数量上限不同:
    • IE 每个域名限制为 50 个。
    • Firefox 每个域名 Cookie 限制为 50 个。
    • Opera 每个域名 Cookie 限制为 30 个。
    • Safari / Webkit 貌似没有 Cookie 限制。但是假如 Cookie 很多,则会使 Header 大小超过服务器的处理的限制,会导致错误发生。
  • 不同浏览器间每个 Cookie 文件大小也不同:
    • Firefox 和 Safari 是 4097 个字节,包括名(name)、值(value)和等号。
    • Opera 是 4096 个字节,包括:名(name)、值(value)和等号。
    • IE 是 4095 个字节,包括:名(name)、值(value)和等号。

8. 综合案例:用户上次访问记录

a. 主要需求

  • 访问一个 Servlet:
    • 如果是第一次访问,则提示欢迎信息;
    • 如果不是第一次访问,则提示欢迎信息,并返回上次访问时间。

b. 代码实现

  • LastTimeServlet:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/LastTimeServlet")
public class LastTimeServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 1.接收Cookie数组,取出指定名称Cookie对象
        Cookie cookie = CookieUtils.findByName("last_time", request.getCookies());
        // 2.判断
        if (cookie == null) {
            // 不存在
            response.getWriter().write("<h1>欢迎您,首次访问....</h1>");
        } else {
            // 存在
            String value = cookie.getValue();
            response.getWriter().write("<h1>欢迎回来,您上次访问时间:" + value + "</h1>");
        }
        // 3.创建Cookie对象,记录本次访问时间
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日-HH:mm:ss");
        String currentTime = simpleDateFormat.format(new Date());
        cookie = new Cookie("last_time", currentTime);
        // 4.设置Cookie存活1年
        cookie.setMaxAge(60 * 60 * 24 * 365);
        // 5.Response响应Cookie
        response.addCookie(cookie);
    }
}
  • CookieUtils:
import javax.servlet.http.Cookie;

public class CookieUtils {

    /*
        根据指定名称,查找cookie对象
     */
    public static Cookie findByName(String name, Cookie[] cookies) {
        // 非空判断
        if (cookies != null && cookies.length > 0) {
            // 遍历
            for (Cookie cookie : cookies) {
                // 判断是否有指定名称的cookie
                if (name.equals(cookie.getName())) {
                    return cookie;
                }
            }
        }
        // 没找到返回null
        return null;
    }
}

c. 用 JSP 实现

  • 参考:JSP 简易模板
  • 首先将 CookieUtils 移动到 utils 文件夹下(没有包名会报错,不建议使用没有包的类,而且 JSP 直接限制了这种类的使用),修改 index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page import="utils.CookieUtils" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>主界面</h1>
<%
    // 1.接收Cookie数组,取出指定名称Cookie对象
    Cookie cookie = CookieUtils.findByName("last_time", request.getCookies());
    // 2.判断
    if (cookie == null) {
        // 不存在
        response.getWriter().write("<h5>欢迎您,首次访问....</h5>");
    } else {
        // 存在
        String value = cookie.getValue();
        response.getWriter().write("<h5>欢迎回来,您上次访问时间:" + value + "</h5>");
    }
    // 3.创建Cookie对象,记录本次访问时间
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日-HH:mm:ss");
    String currentTime = simpleDateFormat.format(new Date());
    cookie = new Cookie("last_time", currentTime);
    // 4.设置Cookie存活1年
    cookie.setMaxAge(60 * 60 * 24 * 365);
    // 5.Response响应Cookie
    response.addCookie(cookie);
    response.getWriter().write("");
%>
</body>
</html>

9. 综合案例:商品浏览记录

a. 主要需求

  • 做一个商品页面,被访问后,在页面上点击查看商品浏览记录,可以查看到以前浏览过的商品信息。

b. 步骤分析

在这里插入图片描述

c. 代码实现

在这里插入图片描述

i. goods.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>goods</title>
</head>
<body>
<h3>商品列表</h3>
<a href="/webappPractice2/GoodsInfoServlet?name=小米10">小米10</a> <br>
<a href="/webappPractice2/GoodsInfoServlet?name=华为P40">华为P40</a> <br>
<a href="/webappPractice2/GoodsInfoServlet?name=iphoneSE">IPhoneSE</a> <br>
<a href="/webappPractice2/GoodsInfoServlet?name=锤子T2">锤子T2</a> <br>
</body>
</html>

ii. GoodsInfoServlet

package servlet;

import utils.CookieUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.util.Arrays;
import java.util.List;

@WebServlet("/GoodsInfoServlet")
public class GoodsInfoServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8"); // 请求解码
        response.setContentType("text/html;charset=utf-8"); // 响应编码
        // 1.获取请求参数 name(小米10)
        String product = request.getParameter("name");
        // 2.展示当前商品详情
        response.getWriter().write("您当前浏览的商品为:" + product);
        // 3.获取指定名称Cookie对象
        Cookie cookie = CookieUtils.findByName("goods_name", request.getCookies());
        // 4.判断是否存在
        if (cookie == null) {
            // 5.如果不存在,将当前商品设置到Cookie对象中...
            cookie = new Cookie("goods_name", product);
        } else {
            // 6.如果有,将浏览记录取出,格式:小米10-华为P40
            String value = cookie.getValue();
            // 7.判断当前商品是否在此Cookie中
            List<String> list = Arrays.asList(value.split("-"));
            // 8.如果不包含,追加
            if (!list.contains(product)) {
                value = value + "-" + product; // 格式:小米10-华为P40
            }
            // 9.将value,重置到Cookie中
            cookie = new Cookie("goods_name", value);
        }
        // 10.通过Response响应到浏览器
        // 设置存活时间为1年
        cookie.setMaxAge(60 * 60 * 24 * 365);
        response.addCookie(cookie);

        // 11.制作a标签,实现记录浏览商品功能
        response.getWriter().write("<br><a href='/webappPractice2/static/goods.html'>继续浏览</a>");

        // 12.制作a标签,实现查看浏览记录功能
        response.getWriter().write("<br><a href='/webappPractice2/history.jsp'>浏览记录</a>");
    }
}
  • utils.CookieUtils:
package utils;

import javax.servlet.http.Cookie;

public class CookieUtils {

    /*
        根据指定名称,查找cookie对象
     */
    public static Cookie findByName(String name, Cookie[] cookies) {
        // 非空判断
        if (cookies != null && cookies.length > 0) {
            // 遍历
            for (Cookie cookie : cookies) {
                // 判断是否有指定名称的cookie
                if (name.equals(cookie.getName())) {
                    return cookie;
                }
            }
        }
        // 没找到返回null
        return null;
    }
}

昨天深夜敲代码不知道怎么把 I/ai/ 敲成了 l/el/,一直 404 报错,今天成功 debug。

iii. history.jsp

<%@ page import="utils.CookieUtils" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>history</title>
</head>
<body>
<%
    // java的代码
    // 1.获取指定名称Cookie对象
    Cookie cookie = CookieUtils.findByName("goods_name", request.getCookies());
    // 2.判断是否存在浏览记录
    if (cookie == null) {
        // 没有提示
        out.write("暂无浏览记录....");
    } else {
        // 有的话,遍历显示
        out.write("浏览记录如下:<br>");
        String value = cookie.getValue(); // 格式:小米10-华为P40
        for (String product : value.split("-")) {
            out.write(product + "<br>");
        }
    }
%>
</body>
</html>

iv. 测试


原文链接:https://qwert.blog.csdn.net/article/details/105604964

发布了401 篇原创文章 · 获赞 416 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/105604964