目录
Cookie
1. 会话的概述
a. 什么是会话?
- 日常生活中:从拨通电话到挂断电话之间的一连串你问我答的过程就是一个会话。
- B/S 架构中:从浏览器第一次给服务器发送请求时,建立会话;直到有一方断开,会话结束。
- 一次会话:包含多次请求响应。浏览器与服务器建立连接,其中可以存在多次的请求,一直到有一方停止,会话才结束。
b. 会话技术
- HTTP(超文本传输协议)是一个无状态协议,同一个会话的连续两个请求相互独立,彼此并不了解。
- 会话技术:用于存储浏览器与服务器在请求和响应过程中产生的数据。
- Cookie:客户端会话技术,数据是保存在浏览器上;
- Session:服务器端会话技术, 数据是保存在服务器上。
2. Cookie 的概述
- Cookie 的作用:在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)。
3. 存储与获得 Cookie
a. 设置数据到 Cookie 中
- 创建 Cookie 对象,设置数据:
Cookie cookie = new Cookie(String name,String value);
- 通过 Response,响应(返回)Cookie:
response.addCookie(cookie);
b. 从 Cookie 中获取数据
- 通过 Request 对象,接收 Cookie 数组(即获取所有的 Cookie):
Cookie[] cookies = request.getCookies();
- 遍历数组:
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);
}
}
}
}
- 依次访问 http://localhost:8080/webappPractice2/SetServlet 和 http://localhost:8080/webappPractice2/GetServlet,页面输出:
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
- 创建多个 Cookie 对象:
Cookie cookie1 = new Cookie("name","Regino");
Cookie cookie2 = new Cookie("age","23");
- 通过 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);
}
}
}
}
- 依次访问 http://localhost:8080/webappPractice2/EncodeCookie,http://localhost:8080/webappPractice2/GetCookie,控制台输出:
d. Cookie 共享数据的范围
i. 在一个 Tomcat 服务器中,部署了多个 web 项目,那么这些 web 项目的 Cookie 能否共享?
- 默认情况下不可以共享。
默认 Cookie 的携带路径,是当前设置 Cookie 的 Serlvet 父路径。例如:- 设置 Cookie:
http://localhost:8080/webappPractice2/EncodeCookie
- 默认携带路径:
http://localhost:8080/webappPractice2
- 设置 Cookie:
- 但是可以通过指定 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. 测试
- 存储并获得 Cookie:依次访问 http://localhost:8080/webappPractice2/setCookie,http://localhost:8080/webappPractice2/getCookie,控制台输出:
- 删除指定 Cookie:依次访问 http://localhost:8080/webappPractice2/removeCookie,http://localhost:8080/webappPractice2/getCookie,控制台输出:
- 删除指定目录下所有 Cookie:依次访问 http://localhost:8080/webappPractice2/removeAllCookie,http://localhost:8080/webappPractice2/getCookie,控制台输出:
- 调出调试页面,查看剩余的 Cookie:
- 这两个 Cookie 是每次访问 IDEA 生成的,可以不予理会。
7. Cookie 的特点
- Cookie 存储数据都在客户端(浏览器);
- Cookie 的存储数据只能是字符串;
- Cookie 单个大小不能超过 4KB;
- 同一个域名下 Cookie 数量不能超过 50 个;
- Cookie 路径不同,可以重名出现;
- 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;
}
}
- 访问 http://localhost:8080/webappPractice2/LastTimeServlet,页面显示:
- 刷新页面(浏览器再次发送请求),页面显示:
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. 测试
- 首先
cookie.setMaxAge(0);
清空 Cookie,然后再改回有效值; - 访问 http://localhost:8080/webappPractice2/static/goods.html,选择框内链接,页面依次展示: