板块一 Servlet编程:第五节 Cookie对象全解 来自【汤米尼克的JAVAEE全套教程专栏】
板块一 Servlet编程:第五节 Cookie对象全解
- 一、什么是Cookie
- Cookie的源码
- 二、Cookie的具体操作
- (1)创建Cookie
- (2)获取Cookie
- (3)设置Cookie的到期时间
- (4)设置Cookie的路径
- 三、Cookie的相关事项
在上一节中我们学完了Servlet的
service()
的两个形参,也就是HttpServletRequest和HttpServletResponse两大对象的实例,通过这两个对象可以实现Web交互在后端的请求响应功能。从这一节开始,我们将详解Servlet传递、保存数据的功能,Servlet的第三个对象:Cookie
一、什么是Cookie
我们在网上冲浪时,有时登录一个网站之前,会跳出一个Cookie允许弹出,在浏览器的设置中,也有Cookie是否保存的开关,保存登录密码就是用Cookie实现的,那么这个Cookie究竟是什么?在Web交互过程中起到了什么作用?
这件事还要从 第一节 HTTP协议理论与服务器请求响应原理 说起,在那一小节中,我们说HTTP是无状态协议,即协议对于事务处理没有记忆能力,这样有利于HTTP协议的简单性,但对于Servlet这就显得乏善可陈了,因为这意味着我们每一个会话的数据传输量会增大。举个栗子,就像我们下班回家的时候,小区大门的保安大爷每天都要问你是几栋几单元哪户的才给你放行,真是麻烦,有一天你跑去物业那里办了一张门禁卡,终于可以自由进出小区门了,这张门禁卡就是Cookie
- Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或把在客户端进行处理的数据放在本地的计算机上,不需要通过网络传输,进而提高网页处理的效率,减少服务器的负载,但是由于Cookie是服务器端保存在客户端的信息,所以其安全性也是很差的。例如常见的记住密码功能则可以通过Cookie
来实现 - Servlet中,有一个专门操作Cookie的类
javax.servlet.http.Cookie
,随着服务器端的响应发送给客户端,保存在浏览器。当下次再访问服务器时把Cookie再带回服务器
实例:在开发者工具中查看Cookie是怎样保存的
还是以百度一下为例,
可以在响应头键值对里看见一个名为Set-Cookie
的键,实际上当前 Cookie有两个版本,分别对应两种设置响应头:Set-Cookie
和 Set-Cookie2
但在Servlet中并不支持Set-Cookie2,所以我们来看看Set-Cookie的属性项
同样可以在请求头键值对里看见一个名为Cookie的键里储存着看不懂的值,Cookie在请求头键值对里的格式:键值对用=
链接,多个键值对间通过;
隔开
或者在应用
中查看当前存储着的Cookie,也能发现很多看不懂的键值对
Cookie的源码
我们来看看Cookie的部分源码,使用注释详解
public class Cookie implements Cloneable, Serializable {// final修改字段不可重写private static final CookieNameValidator validation;private static final long serialVersionUID = 1L;// 定义Cookie的名字变量private final String name;// 定义Cookie的值变量private String value;// 版本信息private int version = 0;private String comment;// 域名private String domain;// 过期时间private int maxAge = -1;private String path;private boolean secure;private boolean httpOnly;// Cookie的构造函数,可以看出是带参构造,必须要实现两个形参name和valuepublic Cookie(String name, String value) {validation.validate(name); // name的唯一校验this.name = name;this.value = value;}。。。再往下就是上面字段的get(),set()方法
二、Cookie的具体操作
(1)创建Cookie
通过 new Cookie("key","value");
来创建一个Cookie对象,要想将Cookie随响应发送到客户端,需要先添加到Response对象中:Response.addCookie(cookie);
此时该Cookie对象则随着响应发送至了客户端。在浏览器上可以被看见
实例
在satrt.java中导入javax.servlet.http.Cookie
,写入测试代码
package www.caijiyuan;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.http.Cookie;@WebServlet("/start")
public class start extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 创建Cookie对象Cookie cookie = new Cookie("Cooikename", "Cookievalue");// 发送Cookie对象resp.addCookie(cookie);}
}
启动服务器,在浏览器中访问start,在开发者工具中就可以获取到当前Cookie的键值了
(2)获取Cookie
Cookie的获取只能通过Cookie数组遍历来取得,不能单独拎一个出来
通过Request对象的getCookies()
方法调用获得Cookie数组,然后用get()
方法取得键值
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();
实例:在after.java中获取start.java中存储的Cookie值
after.java中导入javax.servlet.http.Cookie
,写入测试代码
package www.caijiyuan;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.http.Cookie;
@WebServlet("/after")
public class after extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取cookie数组Cookie[] cookies = req.getCookies();//判断cookie是否为空if (cookies != null && cookies.length > 0) {//遍历cookie数组for (Cookie cookie : cookies) {// 获取cookie的名称和值String Cookiename = cookie.getName();String Cookievalue = cookie.getValue();System.out.println("键:" + Cookiename + ",值:" + Cookievalue);}}}
}
启动服务器,在浏览器中先后访问start和after,即可在控制台得到
这就获取到了Cookie
(3)设置Cookie的到期时间
Cookie是浏览器的技术,与服务器无关,服务器的关闭、重启都不影响Cookie的值,Cookie的死亡与我们设置的到期时间有关。可以通过手动设定Cookie的有效时间,setMaxAge(int time);
方法设定cookie的最大有效时间,以秒为单位。默认为当前浏览器关闭即失效
到期时间的取值
- 负整数
若为负数,表示不存储该Cookie。
Cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口Cookie就会消失 - 正整数
若大于0的整数,表示存储的秒数。
此时浏览器会把Cookie保存到硬盘上,就算关闭浏览器、重启客户端电脑,Cookie也会存活相应的时间。 - 若为0,表示删除该 Cookie。
如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)
来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。
实例:在start.java的代码段中为Cookie实例加入设置存活时间的方法setMaxAge()
// 创建Cookie对象
Cookie cookie = new Cookie("Cooikename", "Cookievalue");
// 设置存活时间
cookie.setMaxAge(30);
// 发送Cookie对象
resp.addCookie(cookie);
启动服务器,在浏览器中访问start,即可中在开发者工具中查看当前Cookie的到期时间的时间戳
(4)设置Cookie的路径
Cookie的setPath设置cookie的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些cookie
- 情景一:当前Tomcat服务器下任何项目(站点)的任意资源都可获取Cookie对象
Cookie cookie = new Cookie("xxx", "xxx");
// 设置路径为”/",表示在当前服务器下任何项目都可访问到cookie对象
cookie.setPath("/");
response.addcookie(cookie);
- 情景二:指定项目(站点)下的资源可获取Cookie对象(不设置Cookie的path时)
Cookie cookie = new Cookie("xxx", "xxx");
// 设置路径为"/start”,表示当前项目可全部访问到cookie对象
cookie.setPath("/ www.caijiyuan");// 默认如此
cookie.setPath("/xxx");// 表示指定站点xxx下的资源可以获取Cookie对象
response.addcookie(cookie);
例如当前站点就是 www.caijiyuan
一个Tomcat服务器下可能有很多个站点,一个站点和里面的资源的结构就是这样
- 情景三:指定项目(站点)下的某个资源可获取Cookie对象
Cookie cookie = new Cookie("xxx", "xxx");
// 设置路径为"/www.caijiyuan/start",表示在/www.caijiyuan/start目录下才可访问到Cookie对象
cookie.setPath("/www.caijiyuan/start");
response.addcookie(cookie);
如果我们设置path时当前访问的路径包含了Cookie的路径(当前访问路径要比Cookie的范围小)Cookie就会加载到Request对象之中。当访问的路径包含了Cookie的路径时,则该请求将带上该Cookie,如果访问路径不包含Cookie路径,则请求不会携带该Cookie
三、Cookie的相关事项
- Cookie保存在当前浏览器中
Cookie操作只是将信息保存在本机上,换电脑或跨浏览器后以后这些信息就失效了 - Cookie存中文问题
Cookie 中不能出现中文,如果有中文则通过URLEncoder.encode()
来进行编码,获取时通过URLDecoder.decode()
来进行解码。
实例
保存时编码
String Cookiename="姓名";
String Cookievalue="汤米尼克";
// 通过 URLEncoder.encode()来进行编码
Cookiename= URLEncoder.encode(Cookiename);
Cookievalue= URLEncoder.encode(Cookievalue);
// 创建Cookie对象
Cookie cookie = new Cookie(Cookiename,Cookievalue);
// 发送Cookie对象
response.addcookie(cookie);
获取时解码
// 获取时通过 URLDecoder.decode()来进行解码
URLDecoder.decode(cookie.getName());
URLDecoder.decode(cookie.getValue());
- 同名Cookie问题
如果服务器端发送重复的Cookie(名称)那么会覆盖原有的Cookie - 浏览器存储Cookie问题
不同的浏览器对Cookie有不同的存储上限,一般大小上限4KB左右。Cookie是存储在客户端(浏览器)的,由服务器端创建和设定。后期结合Session来实现回话跟踪。
以上就是本小节的所有内容,但Cookie是有大小限制和数量限制的,并且越来越多的Cookie代表客户端和服务器的传输量增加,可不可以每次传的时候不传所有cookie值,而只传一个唯一ID,通过这个ID直接在服务器查找用户信息呢?答案是有的,这就是我们的session,在下一节中我们来详解session
相关文章:

板块一 Servlet编程:第五节 Cookie对象全解 来自【汤米尼克的JAVAEE全套教程专栏】
板块一 Servlet编程:第五节 Cookie对象全解 一、什么是CookieCookie的源码 二、Cookie的具体操作(1)创建Cookie(2)获取Cookie(3)设置Cookie的到期时间(4)设置Cookie的路径…...
自动驾驶---Motion Planning之Path Boundary
1 背景 在上文《自动驾驶---Motion Planning之LaneChange》中,笔者提到过两种LaneChange的思路,这里再简单回顾一下:(1)利用Routing和周围环境的信息,决定是否进行换道的决策;(2)采用的博弈思想(蒙特卡洛树搜索---MCTS)决定是否进行换道的决策。不管是变道,避让还是…...
Leetcode 3048. Earliest Second to Mark Indices I
Leetcode 3048. Earliest Second to Mark Indices I 1. 解题思路2. 代码实现 题目链接:3048. Earliest Second to Mark Indices I 1. 解题思路 这一题的话基础的思路就是二分法查找最小的可以将所有的数字都mark上的最小位置。 因此,这里的问题就会变…...

从源码学习单例模式
单例模式 单例模式是一种设计模式,常用于确保一个类只有一个实例,并提供一个全局访问点。这意味着无论在程序的哪个地方,只能创建一个该类的实例,而不会出现多个相同实例的情况。 在单例模式中,常用的实现方式包括懒汉…...
axios介绍和使用
1. Axios是什么 Axios框架全称(ajax – I/O – system) Axios是一个基于Promise的JavaScript HTTP客户端,用于浏览器和Node.js环境。它可以发送HTTP请求并支持诸如请求和响应拦截、转换数据、取消请求以及自动转换JSON数据等功能。 Axios提…...
redis雪崩问题
Redis雪崩问题是指在Redis缓存系统中,由于某些原因导致大量缓存数据同时失效或过期,导致所有请求都直接访问数据库,从而引发数据库性能问题甚至宕机的情况。 造成Redis雪崩问题的原因主要有以下几个: 缓存数据同时失效ÿ…...

[SUCTF 2019]EasySQL1 题目分析与详解
一、题目介绍 1、题目来源: BUUCTF网站,网址:https://buuoj.cn/challenges 2、题目描述: 通过以上信息,拿到flag。 二、解题思路 首先打开靶机,尝试输入1查看回显,回显如图所示:…...

TestNG与ExtentReport单元测试导出报告文档
TestNG与ExtentReport集成 目录 1 通过实现ITestListener的方法添加Reporter log 1.1 MyTestListener设置 1.2 输出结果 2 TestNG与ExtentReporter集成 2.1 项目结构 2.2 MyExtentReportListener设置 2.3 单多Suite、Test组合测试 2.3.1 单Suite单Test 2.3…...

【JavaEE】_form表单构造HTTP请求
目录 1. form表单的格式 1.1 form表单的常用属性 1.2 form表单的常用搭配标签:input 2. form表单构造GET请求实例 3. form表单构造POST请求实例 4. form表单构造法的缺陷 对于客户端浏览器,以下操作即构造了HTTP请求: 1. 直接在浏览器…...
Mysql中INFORMATION_SCHEMA虚拟库使用
虚拟库字段讲解 #查看INFORMATION_SCHEMA的表信息 DESC information_schema.tables; 重要列: TABLE_SCHEMA #表所在的库 TABLE_NAME #表名 ENGINE #表的存储引擎 TABLE_ROWS #表的行数 DATA_LENGTH #表数据行占用的字节数 AVG_ROW_LENGTH #平均行长度 INDEX_LENGTH…...

【《高性能 MySQL》摘录】第 2 章 MySQL 基准测试
文章目录 2.1 为什么需要基准测试2.2 基准测试的策略2.2.1 测试何种指标 2.3 基准测试方法2.3.1 设计和规划基准测试2.3.2 基准测试应该运行多长时间2.3.3 获取系统性能和状态2.3.4 获得准确的测试结果2.3.5 运行基准测试并分析结果2.3.6 绘图的重要性 2.4 基准测试工具…...

常用的Web应用程序的自动测试工具有哪些
在Web应用程序的自动化测试领域,有许多流行的工具可供选择。以下是一些常用的Web自动化测试工具: 1. Selenium - Selenium是最流行的开源Web应用程序自动化测试套件之一。 - 它支持多种编程语言,如Java、C#、Python、Ruby等。 …...
人工智能与开源机器学习框架
链接:华为机考原题 TensorFlow是一个开源的机器学习框架,由Google开发和维护。它提供了一个针对神经网络和深度学习的强大工具集,能够帮助开发人员构建和训练各种机器学习模型。 TensorFlow的基本概念包括: 张量(Ten…...

高通XBL阶段读取分区
【需求】: 在某些场景下,需要在XBL阶段读取分区数据,需要验证xbl阶段方案 这里主要以裸分区为例,比如oem分区。 1、创建一个1MB大小的oem.img,写入内容“test oem partition” 创建方式: dd if/dev/null …...

[极客大挑战2019]upload
该题考点:后缀黑名单文件内容过滤php木马的几种书写方法 phtml可以解析php代码;<script language"php">eval($_POST[cmd]);</script> 犯蠢的点儿:利用html、php空格和php.不解析<script language"php"&…...
[FastDDS] 基于eProsima FastDDS的移动机器人数据中间件
[FastDDS] 基于eProsima FastDDS的移动机器人数据中间件 注明:无 本栏目主要讲述,基于eProsima FastDDS的移动机器人数据中间件的实现、使用、性能测试。 What is [ FastDDS ]: eProsima Fast DDS是DDS(数据分发服务)规范的C实现…...

实现外网手机或者电脑随时随地远程访问家里的电脑主机(linux为例)
文章目录 一、背景概要二、安装配置花生壳软件(linux版本)三、手机端(外网)验证连接四、安装ubuntu20server版系统遇到的问题记录 一、背景概要 由于经常在遇到某些问题的时候,针对某一个场景的理解,需要借助于自己的电脑去编译(aosp/linux/qemu)代码查…...

spring boot集成redis
引入依赖 <!-- redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 连接池依赖 --><dependency><groupId>org.ap…...
Docker的常用命令
Docker的常用命令 Docker是一个开源的应用容器引擎,它使得开发者能够打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间没有任何接口ÿ…...
JSON简介与基本使用
JSON简介与基本使用 引言 在现今的互联网开发中,数据交换格式的选择至关重要。其中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读和易写的特性而备受青睐。本文将简要介绍JSON的基…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...