板块一 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://xiahunao.cn/news/2806634.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC 学习(一)之 SpringMVC 介绍

目录 1 MVC 介绍 2 SpringMVC 介绍 2.1 SpringMVC 特点 2.2 SpringMVC 的核心组件 2.3 SpringMVC 执行流程 3 参考文档 1 MVC 介绍 MVC (Model View Controller) 是一种设计思想,它将应用程序分为三大组件:模型 (Model)、视图 (View)、控制器 (Con…

恒峰|高压森林应急消防泵|守护森林安全

森林是地球的肺腑,是人类赖以生存的重要资源。然而,随着人类活动的增加,森林火灾频发,给生态环境和人类生活带来严重威胁。为了保护森林资源,我们必须采取有效的措施进行消防。高压森林应急消防泵作为一种高效、环保的…

【复现】用友U8 oa协同工作系统 文件上传漏洞_57

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 用友U8 -OA 协同办公管理系统,可把日常业务、事物、协作等信息在企业的各分子公司、部门、群组、个人之间…

python获取某天气网站公开天气数据

注意:代码仅用于学习 相关网址:https://tianqi.2345.com/wea_history/57687/htm 查找url : 查找城市ID: 城市ID文件demo.js(JavaScript): function get_city(){var provqxnew Array();provqx[10][58321-H 合肥-58321|71873-B 包河-58321|58…

2023年12月CCF-GESP编程能力等级认证C++编程七级真题解析

一、单选题(共15题,共30分) 第1题 定义变量 double x ,如果下面代码输入为 100 ,输出最接近( )。 A:0 B:-5 C:-8 D:8 答案:B 第2题 对于下面动态规划方法实现的函数,以下选项中最适合表达其状态转移函数的为( )。 A: B: C: D:

【Spring】 AOP面向切面编程

文章目录 AOP是什么?一、AOP术语名词介绍二、Spring AOP框架介绍和关系梳理三、Spring AOP基于注解方式实现和细节3.1 Spring AOP底层技术组成3.2 初步实现3.3 获取通知细节信息3.4 切点表达式语法3.5 重用(提取)切点表达式3.6 环绕通知3.7 切…

一分钟 由浅入深 学会Navigation

目录 1.官网正式概念 1.1 初认知 2.导入依赖 2.1 使用navigation 2.2 safe Args插件-> 传递数据时用 3.使用Navigation 3.1 搭建初始框架 3.2 确定action箭头的属性 3.3 为Activity添加NavHostFragment控件 3.4 NavController 管理应用导航的对象 3.5 数据传递(单…

给定一个边与边可能相交的多边形,求它的轮廓线

大家好,我是前端西瓜哥。 最近遇到一个需求,给定一个多边形(边与边可能相交),求这个多边形的轮廓线。 需要注意的是,轮廓线多边形内不能有空洞,使用的不是常见的非零绕数规则(nonze…

SpringBoot3+Vue3 基础知识(持续更新中~)

bean 把方法的返回结果注入到ioc中 1: 2: 3: 组合注解封装 实战篇: 解析token: 统一携带token: 驼峰命名与下划线命名转换: NotEmpty!!! mybatis: PageHelper设置后,会将pageNum,和pageSize自己拼接…

代码随想录算法训练营第四一天 | 背包问题

目录 背包问题01背包二维dp数组01背包一维 dp 数组(滚动数组)分割等和子集 LeetCode 背包问题 01背包 有n件物品和一个最多能背重量为 w 的背包,第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次&#x…

Python urllib、requests、HTMLParser

HTTP协议 HTTP 协议:一般指HTTP(超文本传输)协议。 HTTP是为Web浏览器和Web服务器之间的通信而设计的,基于TCP/IP通信协议嘞传递数据。 HTTP消息结构 客户端请求消息 客户端发送一个HTTP请求到服务器的请求消息包括以下格式 请求行(request line)请求…

【前端素材】推荐优质后台管理系统Start Admin平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具,它通常作为一个独立的后台界面存在,供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能: 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

Linux——静态库

Linux——静态库 静态库分析一下 ar指令生成静态库静态库的使用第三方库优化一下 gcc -I(大写的i) -L -l(小写的l),头文件搜索路径,库文件搜索路径,连接库 今天我们来学习静态库的基本知识。 静态库 在了解静态库之前,我们首先来…

复旦大学MBA聚劲联合会:洞见智慧,拓宽思维格局及国际化视野

12月2日,“焕拥时代 俱创未来”聚劲联合会俱创会年度盛典暨俱乐部募新仪式圆满收官。16家复旦MBA俱乐部、200余名同学、校友、各界同仁齐聚复旦管院,一起在精彩纷呈的圆桌论坛里激荡思想,在活力四射的俱乐部风采展示中凝聚力量。      以…

CSS 的圆角矩形

CSS 的圆角矩形 通过 border-radius 属性使矩形边框带圆角效果成为圆角矩形 语法:border-radius: length; length 是内切圆的半径,其数值越大, 弧线越明显 border-radius 属性值描述length定义圆角的形状%以百分比定义圆角的形状 生成圆形 让 border-…

高和汽车停工停产,创始人丁磊终于发话了!2024的冷门项目,投入小,但是真的很赚钱!

高和创始人丁磊站在停产停工的工厂呢, 环顾冷清❄️的四周,眉头紧锁😣, 停顿片刻后对旁边同样愁眉苦脸的员工说道: 非常抱歉,因为经营的失误,面临了停产停工的窘境。 在互联网🔗、物…

C/C++的内存管理(2)——new与delete的内核与本质

内存管理 operator new 与 operator delete函数回看new与delete的实现内置类型自定义类型 常见面试题 我们已经知道了new与delete的用法及其好处,发现它似乎与C语言中的动态内存开辟的函数(malloc/calloc/realloc)不同 在这里我们特别指出&am…

二进制部署k8s集群之cni网络插件

目录 k8s的三种网络模式 pod内容器之间的通信 同一个node节点中pod之间通信 不同的node节点的pod之间通信 flannel网络插件 flannel的三种工作方式 VxLAN host-GW UDP Flannel udp 模式 Flannel VXLAN 模式 flannel插件的三大模式的总结 calico网络插件 k8s 组网…

命令绕过 [安洵杯 2019]easy_web1

打开题目 打开题目在URL处看到cmd,本能的直接用系统命令ls 发现被过滤了。又注意到imgTXpVek5UTTFNbVUzTURabE5qYz0似乎是一串base64 拿去base64解码 再hex解码一次得到555.png 再将其hex加密 base64加密 反向推出index.php的payload:?imgTmprMlJUWTBOalUzT0RK…

通过Colab部署Google最新发布的Gemma模型

Gemma的简单介绍 Gemma 是一系列轻量级、最先进的开放式模型,采用与创建 Gemini 模型相同的研究和技术而构建。 Gemma 由 Google DeepMind 和 Google 的其他团队开发,其灵感来自 Gemini,其名称反映了拉丁语 gemma,意思是“宝石”…