板块一 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-CookieSet-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/699311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS】利用高程进行坡度分析:区域面/河道坡度

在ArcGIS中利用高程进行坡度分析 坡度ArcGIS实操案例1:流域面上坡度计算案例2:河道坡度计算2.1 案例数据2.2 操作步骤 参考 坡度 坡度是地表单元陡缓的程度,通常把坡面的垂直高度和水平距离的比值称为坡度。 坡度的表示方法有百分比法、度数…

计算机网络面经-TCP三次握手一文说清

目录 说一下TCP的三次握手? 为什么要三次握手?两次行不行?四次呢? 为什么建立连接是三次握手,关闭连接确是四次挥手呢? TCP四次挥手的过程? 如果已经建立了连接,但是客户端突然出…

TSL四次握手

HTTPS 常用的密钥交换算法有两种,分别是 RSA 和 ECDHE 算法。 其中,RSA 是比较传统的密钥交换算法,它不具备前向安全的性质,因此现在很少服务器使用的。而 ECDHE 算法具有前向安全,所以被广泛使用。 1. ECDHE算法 1.…

PostgreSQL如何使用UUID

离线安装时,一般有四个包,都安装的话,只需要开启uuid的使用即可,如果工具包(即 postgresql11-contrib)没有安装的话,需要单独安装一次,再进行开启。 开启UUID方法 下面介绍一下如何开启&#…

ELK介绍以及搭建

基础环境 hostnamectl set-hostname els01 hostnamectl set-hostname els02 hostnamectl set-hostname els03 hostnamectl set-hostname kbased -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config systemctl stop firewalld & systemctl disable firewalld# 安…

互联设备-中继器-路由器等

网卡的主要作用 1 在发送方 把从计算机系统要发送的数据转换成能在网线上传输的bit 流 。 2 在接收方 把从网线上接收来的 bit 流重组成计算机系统可以 处理的数据 。 3 判断数据是否是发给自己的 4 发送和控制计算机系统和网线数据流 计算机的分类 1、台式机 2、小型机和服…

亿道丨三防平板丨加固平板丨为零售业提供四大优势

随着全球经济的快速发展,作为传统行业的零售业也迎来了绝佳的发展机遇,在互联网智能化的大环境下,越来越多的零售企业选择三防平板电脑作为工作中的电子设备。作为一种耐用的移动选项,三防平板带来的不仅仅是坚固的外壳。坚固耐用…

计算机网络面经-从浏览器地址栏输入 url 到显示主页的过程?

大概的过程比较简单,但是有很多点可以细挖:DNS解析、TCP三次握手、HTTP报文格式、TCP四次挥手等等。 DNS 解析:将域名解析成对应的 IP 地址。TCP连接:与服务器通过三次握手,建立 TCP 连接向服务器发送 HTTP 请求服务器…

模型 KISS复盘法

系列文章 分享 模型,了解更多👉 模型_总纲目录。重在提升认知。反思过去,不断进步。 1 KISS复盘法的应用 1.1 团队项目复盘 在一个团队项目结束后,团队成员可以使用KISS模型进行复盘,以总结经验教训并改进未来的工作…

Web3之光:揭秘数字创新的未来

随着数字化时代的深入发展,Web3正以其独特的技术和理念,为我们打开数字创新的崭新视角。作为数字化时代的新兴力量,Web3将深刻影响着我们的生活、工作和社会。本文将揭秘Web3的奥秘,探讨其在数字创新领域的前景和潜力。 1. 重新定…

HTTP 与 HTTPS-HTTP 解决了 HTTP 哪些问题?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTP 解决了 HTTP 哪些问题? HTTP 由于是明文传输,所以安全上存在以下三个风险: 窃听风险,比如通信链路上可以获取通信内容,用户号容易没。篡改风险,比如…

Spark: a little summary

转眼写spark一年半了,从之前写机器学习组件、做olap到后面做图计算,一直都是用的spark,惭愧的是没太看过里面的源码。这篇文章的目的是总结一下Spark里面比较重要的point,重点部分会稍微看一下源代码,因为spark是跟cli…

(done) 矩阵的对角化,以及是否可对角化的判断、还有对角化的本质。相似对角化计算过程

相似对角化 和 对角化 很大程度上是一回事 甚至判断两个矩阵的相似性,也跟对角化有很大关系 参考视频1:https://www.bilibili.com/video/BV1PA411T7b5/?spm_id_from333.788&vd_source7a1a0bc74158c6993c7355c5490fc600 参考视频2:http…

在 Jupyter Notebook 中查看所使用的 Python 版本和 Python 解释器路径

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 我们在做 Python 开发时,有时在我们的服务器上可能安装了多个 Python 版本。 使用 conda info --envs 可以列出所有的 conda 环境。当在 Linux 服务器上使用 which python 命令时&#xff0…

解决IDEA中Maven下载依赖包过慢或报错的问题

由于公司项目迭代,越来越多的项目开始转型新版本,由于我对Java一直不感冒,但要顺应公司项目要求,遂自己要逐步开始完善Java相关的知识层面,此篇是我在学习SpringBoot时对一些不懂地方及遇到问题时的记录。 学习视频链…

ChatGPT plus 的平替:9个可以联网的免费AI搜索引擎

ChatGPT plus 的平替:9个可以联网的免费AI搜索引擎。 由于ChatGPT 训练数据截止到2021年9月,在该时间点之后发生的事件,ChatGPT均无法给出答复。所以,大家现在都非常期待ChatGPT能够联网,访问实时的信息。 ChatGPT pl…

详解编译和链接!

目录 1. 翻译环境和运行环境 2. 翻译环境 2.1 预处理 2.2 编译 2.3 汇编 2.4 链接 3. 运行环境 4.完结散花 悟已往之不谏,知来者犹可追 创作不易,宝子们!如果这篇文章对你们…

如何用壁纸讲述你的墙故事?

1、方小童在线工具集 网址: 方小童 该网站是一款在线工具集合的网站,目前包含PDF文件在线转换、随机生成美女图片、精美壁纸、电子书搜索等功能,喜欢的可以赶紧去试试!

Linux Android USB gadget(从设备驱动)

Linux Android USB gadget 一:Linux usb gadget 与 Android Composite Gadget二:原生方式和Android方式如何配置函数调用逻辑内核配置原生驱动android驱动三:mass_storage配置虚拟化U盘四:遍历usb设备五:adb usb判断usb设备为adb获取adb配置信息adb设备序列号发送与接收《Linux…

linux服务器tomcat日志中文出现问号乱码

目录 一、场景二、排查三、原因四、解决 一、场景 tomcat日志的中文出现问号乱码 乱码示例 ??[377995738417729536]????????? ac??????????????message:二、排查 1、使用locale命令查看服务器当前使用的语言包 发现只用的语言包为utf-8&#xff0…