Cookie学习笔记

2023-05-16

1、cookie 简介

1.1 什么是 cookie

cookie,有时我们也用其复数形式 cookies,是服务端保存在浏览器端的数据片段。以 key/value 的形式进行保存。每次请求的时候,请求头会自动包含本网站此目录下的 cookie 数据。网站经常使用这个技术来识别用户是否登陆等功能。
简单的说,cookie 就是服务端留给计算机用户浏览器端的小文件。

  • HTTP 是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的 Web 程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于 http 协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而 Cookie 就是解决方案之一。
  • Cookie 实际上就是服务器保存在浏览器上的一段信息。浏览器有了 Cookie 之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。
  • 例如:我们上文说的网上商城,当用户向购物车中添加一个商品时,服务器会将这个条信息封装成一个 Cookie 发送给浏览器,浏览器收到 Cookie,会将它保存在内存中(注意这里的内存是本机内存,而不是服务器内存),那之后每次向服务器发送请求,浏览器都会携带该Cookie,而服务器就可以通过读取 Cookie 来判断用户到底买了哪些商品。
    当用户进行结账操作时,服务器就可以根据 Cookie 的信息来做结算。

Cookie 的用途:

  • 网上商城的购物车
  • 保持用户登录状态

Cookie 的缺点

  • Cookie 做为请求或响应报文发送,无形中增加了网络流量。
  • Cookie 是明文传送的安全性差。
  • Cookie 中保存数据是不稳定的,用户可以随时清理 cookie
    各个浏览器对 Cookie 有限制,使用上有局限

1.2 cookie 原理

1)总的来看 Cookie 像是服务器发给浏览器的一张“会员卡”,浏览器每次向服务器发送请求时都会带着这张“会员卡”,当服务器看到这张“会员卡”时就可以识别浏览器的身份。

实际上这个所谓的“会员卡”就是服务器发送的一个响应头:

在这里插入图片描述

2)如图 Set-Cookie 这个响应头就是服务器在向服务器发“会员卡”,这个响应头的名字是 Set-Cookie , 后边JSESSIONID=95A92EC1D7CCB4ADFC24584CB316382E 和 Path=/Test_cookie,是两组键值对的结构就是服务器为这个“会员卡”设置的信息。浏览器收到该信息后就会将它保存到内存或硬盘中。

3)当浏览器再次向服务器发送请求时就会携带这个 Cookie 信息:

在这里插入图片描述
这是浏览器发送的请求报文,中间画红框的就是 Cookie 信息,这里可以理解为浏览器这次带着“会员卡”再次访问服务器。于是服务器就可以根据 Cookie 信息来判断浏览器的状态。
原理图如下:

在这里插入图片描述

2 、Cookie 的使用

2.1 创建对象

cookie 是由服务端创建的,由浏览器端保存的。所以创建对象我们应该在服务端创建 cookie。

cookie 的创建方法:
1)创建一个 CookieServlet
在 Servlet 的 doPost() 方法中编写如下代码:

//创建一个Cookie对象
Cookie cookie = new Cookie("username", "zhangsan");
//将Cookie对象放入response对象中
response.addCookie(cookie);

2)在浏览器中访问该 Servlet,会发现响应头中出现如下内容:Set-Cookie: username=zhangsan
如此就成功的向浏览器设置了一个 Cookie,当我们在刷新页面时会发现浏览器的请求头中出现如下代码:
Cookie: username=zhangsan

3)同样我们还可以同时设置多个 Cookie:

//创建一个Cookie对象
Cookie cookie1 = new Cookie("username", "zhangsan");
Cookie cookie2 = new Cookie("password", "123456");
Cookie cookie3 = new Cookie("age", "20");
//将Cookie对象放入response对象中
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);

浏览器会按以下形式发送 Cookie:
Cookie: username=zhangsan; password=123456; age=20

4)设置 Cookie 就是两个步骤:
创建 Cookie 对象
将 Cookie 对象加入到 response 中

2.2 设置 cookie

2.2.1 cookie 的有效时间

1)经过上边的介绍我们已经知道 Cookie 是存储在浏览器中的,但是可想而知一般情况下浏览器不可能永远保存一个 Cookie,一来是占用硬盘空间,再来一个 Cookie 可能只在某一时刻有用没必要长久保存。

2) 所以我们还需要为 Cookie 设置一个有效时间。

3)通过 Cookie 对象的 setMaxAge()可以设置 Cookie 的有效时间。
其中 setMaxAge()接收一个 int 型的参数,来设置有效时间。参数主要有一下四种情况:

  • 设置为 0,setMaxAge(0)
    Cookie 立即失效,下次浏览器发送请求将不会在携带该 Cookie
  • 设置大于 0,setMaxAge(60)
    表示有效的秒数 60 就代表 60 秒即 1 分钟,也就是 Cookie 在 1 分钟后失效。
  • 设置小于 0,setMaxAge(-1)
    设置为负数表示当前会话有效。也就是关闭浏览器后 Cookie 失效
  • 不设置
    如果不设置失效时间,则默认当前会话有效。

2.2.2 cookie 的路径

1)Cookie 的路径指告诉浏览器访问那些地址时该携带该 Cookie,我们知道浏览器会保存很多不同网站的 Cookie,比如百度的 Cookie,新浪的 Cookie,腾讯的 Cookie 等等。那我们不可能访问百度的时候携带新浪的 Cookie,也不可能访问每个网站时都带上所有的 Cookie 这是不现实的,所以往往我们还需要为 Cookie 设置一个 Path 属性,来告诉浏览器何时携带该 Cookie。

2)我们通过 Cookie 的 setPath()来设置路径,这个路径是由浏览器来解析的所以/代表服务器的根目录。如:

  • 设置为 /项目名/路径 -> cookie.setPath(“/项目名/路径”)
    这样设置只有访问“/项目名/路径”下的的资源才会携带 Cookie
    如:/项目名/路径/1.jsp 、/项目名/路径/hello/2.jsp 等
  • 如果不设置,默认会在访问 “/项目名” 下的资源时携带
    如:“/项目名/index.jsp” 、 “/项目名/hello/index.jsp”
Cookie cookie = new Cookie("username", "abc");
cookie.setMaxAge(60*60*24);//秒为单位,一天后过期
cookie.setPath(getServletContext().getContextPath()+"/");
resp.addCookie(cookie);
resp.sendRedirect(getServletContext().getContextPath()+"/index.jsp");

2.3 读取 cookie

通过以上步骤,我们将 cookie 保存到了浏览器端。那么我们如何读取 cookie 中的值呢。

分析:
cookie 被设置进入浏览器后,每次请求都会携带 cookie 的值,所以我们需要从 request 中取出 cookie 进行解析。

//从request中获取所有cookie
Cookie[] cookies = request.getCookies();
//遍历cookie
for(Cookie c:cookies){
	String cName = c.getName();//获取cookie名
	String cValue = c.getValue();//获取cookie值
	System.out.println("cookie:" + cName + "=" +cValue);
}

如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cookie学习笔记 的相关文章

  • MyBatisPlus(一)概述介绍

    一 概述 需要的基础 xff1a 把MyBatis Spring SpringMVC学习了 为什么要学习它呢 xff1f MyBatisPlus 可以节省我们大量工作时间 xff0c 所有的CRUD 代码它都可以自动化完成 比如 xff1a
  • 为什么要搭建自己的博客

    为什么要搭建自己的博客 xff1f 很多小伙伴起初和我有一样的疑惑 搭建博客的原因如下 现在市面上的博客很多 xff0c 比如如CSDN xff0c 博客园 xff0c 简书等平台 xff0c 可以直接在上面发表 xff0c 用户交互做的好
  • 为什么要写博客

    为什么要写博客 xff1f 我相信很多小伙伴和我有一样的疑惑 最近我也常和身边的朋友说写写博客做总结 xff0c 因为有的时候面试官遇到技术还不错的面试者会问你有没有博客 xff0c 如果有的话会在面试的时候额外加分 据我观察几乎每一个程序
  • hexo搭建博客【详细步骤】适合初学者

    为什么要搭建自己的博客 xff1a https blog csdn net weixin 45606067 article details 107966915 下面说一下如何从零开始上手搭建博客 Hexo搭建博客步骤 xff1a 搭建博客需
  • SpringBoot(一)概述、HelloWord案例

    1 SpringBoot 简介 回顾什么是Spring Spring是一个开源框架 xff0c 2003 年兴起的一个轻量级的Java 开发框架 Spring是为了解决企业级应用开发的复杂性而创建的 xff0c 简化开发 Spring是如何
  • PyTorch:view() 与 reshape() 区别详解

    总之 xff0c 两者都是用来重塑tensor的shape的 view只适合对满足连续性条件 xff08 contiguous xff09 的tensor进行操作 xff0c 而reshape同时还可以对不满足连续性条件的tensor进行操
  • SpringBoot(二)运行原理探究

    我们之前写的HelloSpringBoot xff0c 到底是怎么运行的呢 xff0c Maven项目 xff0c 我们一般从 pom xml文件探究起 SpringBoot2 3 3版本的官网文档说明 xff1a https docs s
  • idea查看源码时总是出现 .class而不是 .java源码

    步骤 1 File gt Settings gt Maven gt importing xff08 勾选上 Sources 和 Documentation xff09 2 右键项目的pom xml gt Maven gt Reimport
  • SpringBoot(三)yaml配置注入

    配置文件 SpringBoot使用一个全局的配置文件 xff0c 配置文件名称是固定的 application properties 语法结构 xff1a key 61 value application yml 语法结构 xff1a ke
  • SpringBoot(四)JSR303数据校验及多环境切换

    1 JSR303数据校验 先看看如何使用 Springboot 中可以用 64 validated 来校验数据 xff0c 如果数据异常则会统一抛出异常 xff0c 方便异常中心统一处理 我们这里来写个注解让我们的 name 只能支持 Em
  • SpringBoot(五)自动配置原理

    1 配置文件到底能写什么 xff1f 怎么写 xff1f SpringBoot 官网有大量的配置说明 xff0c 我们是无法全部记住的 xff1b SpringBoot 2 3 3 官网文档 2 分析自动配置原理 这里我们以 HttpEnc
  • SpringBoot(六)日志处理

    1 日志框架 简单分析案例 xff1a 小张 xff1b 开发一个大型系统 xff1b 1 System out println 34 34 xff1b 将关键数据打印在控制台 xff1b 去掉 xff1f 写在一个文件 xff1f 2 框
  • SpringBoot(七)Web开发静态资源处理

    1 静态资源处理 静态资源映射规则 首先 xff0c 我们搭建一个普通的 SpringBoot 项目 xff0c 回顾一下HelloWorld程序 xff01 写请求非常简单 xff0c 那我们要引入我们前端资源 xff0c 我们项目中有许
  • SpringBoot(八)Thymeleaf模板引擎

    模板引擎 前端交给我们的页面 xff0c 是 html 页面 如果是我们以前开发 xff0c 我们需要把他们转成 jsp 页面 xff0c jsp 好处就是当我们查出一些数据转发到JSP页面以后 xff0c 我们可以用jsp轻松实现数据的显
  • SpringBoot(九)MVC自动配置原理【深入源码】

    官网阅读 在进行项目编写前 xff0c 我们还需要知道一个东西 xff0c 就是 SpringBoot 对我们的 SpringMVC 还做了哪些配置 xff0c 包括如何扩展 xff0c 如何定制 只有把这些都搞清楚了 xff0c 我们在之
  • SpringBoot(十)RestfulCRUD

    我们先创建一个SpringBoot的 web 项目 xff0c 并导入thymeleaf lombok 坐标 1 环境搭建 首先我们先将静态资源及页面拷入到项目中 然后我们编写 pojo dao类 这里我们没有连接数据库 xff0c Dao
  • PyTorch:torch.sum

    torch sum 函数定义 xff1a torch sum input dim keepdim 61 False dtype 61 None Tensor 作用 xff1a 返回输入tensor的指定维度dim上的和 参数keepdim表
  • SpringBoot(十一)国际化

    有的时候 xff0c 我们的网站会去涉及中英文甚至多语言的切换 xff0c 这时候我们就需要学习国际化了 xff01 准备工作 先在IDEA中统一设置 properties 的编码问题 xff01 编写国际化配置文件 xff0c 抽取页面需
  • SpringBoot(十二)整合JDBC

    SpringData简介 对于数据访问层 xff0c 无论是 SQL 关系型数据库 还是 NOSQL 非关系型数据库 xff0c Spring Boot 底层都是采用 Spring Data 的方式进行统一处理 Spring Boot 底层
  • SpringBoot(十三)整合Druid

    Druid简介 Java程序很大一部分要操作数据库 xff0c 为了提高性能操作数据库的时候 xff0c 又不得不使用数据库连接池 Druid 是阿里巴巴开源平台上一个数据库连接池实现 xff0c 结合了 C3P0 DBCP 等 DB 池的

随机推荐

  • SpringBoot(十四)整合MyBatis

    官方文档 xff1a http mybatis org spring boot starter mybatis spring boot autoconfigure Maven仓库地址 xff1a https mvnrepository co
  • SpringBoot(十五)集成SpringSecurity

    安全简介 在 Web 开发中 xff0c 安全一直是非常重要的一个方面 安全虽然属于应用的非功能性需求 xff0c 但是应该在应用开发的初期就考虑进来 如果在应用开发的后期才考虑安全的问题 xff0c 就可能陷入一个两难的境地 xff1a
  • SpringBoot(十七)集成Swagger

    Swagger简介 前后端分离 前端 gt 前端控制层 视图层后端 gt 后端控制层 服务层 数据访问层前后端通过API进行交互前后端相对独立且松耦合 产生的问题 前后端集成 xff0c 前端或者后端无法做到 及时协商 xff0c 尽早解决
  • SpringBoot(十六)集成Shiro

    1 Shiro简介 什么是Shiro xff1f Apache Shiro 是一个Java的安全 xff08 权限 xff09 框架 Shiro 可以非常容易的 xff0c 开发出足够好的应用 xff0c 其不仅可以用在Java环境 xff
  • SpringBoot(十八)异步、定时、邮件任务

    异步任务 异步处理还是非常常用的 xff0c 比如我们在网站上发送邮件 xff0c 后台会去发送邮件 xff0c 此时前台会造成响应不动 xff0c 直到邮件发送完毕 xff0c 响应才会成功 xff0c 所以我们一般会采用多线程的方式去处
  • SpringBoot(二十)集成Dubbo和Zookeeper

    分布式理论 什么是分布式系统 xff1f 在 分布式系统原理与范型 一书中有如下定义 xff1a 分布式系统是若干独立计算机的集合 xff0c 这些计算机对于用户来说就像单个相关系统 xff1b 分布式系统是由一组通过网络进行通信 为了完成
  • SpringBoot(十九)集成Redis

    SpringBoot 集成 Redis 主要就是使用 RedisTemplate 类来进行各种操作 可以很多人没有注意到 xff0c 在 SpringBoot 2 x 之后 xff0c 底层访问redis 已经不再使用 jedis xff0
  • PyTorch:torch.linspace

    函数定义 xff1a torch linspace start end steps 61 100 out 61 None dtype 61 None layout 61 torch strided device 61 None requir
  • 面向对象(1/3)类和对象

    文章目录 面向过程 xff08 POP xff09 与面向对象 xff08 OOP xff09 类和对象 xff08 面向对象的两大要素 xff09 几个概念的使用说明类和对象的使用类的语法格式对象的创建和使用类的访问机制对象的分析 1 属
  • 面向对象(2/3)封装性、继承性、多态性

    文章目录 一 面向对象特征一 xff1a 封装性封装和隐藏权限修饰符类的成员之三 xff1a 构造器属性赋值的先后顺序JavaBeanthis关键字的使用package关键字的使用MVC设计模式import关键字的使用Eclipse中的快捷
  • Git实用命令大全(附思维导图)

    一 平时我们经常用的命令 1 基础命令 span class token comment 初始化 span span class token function git span init span class token comment 将
  • 面向对象(3/3)抽象类,接口、内部类、代码块

    文章目录 1 java lang Object1 61 61 和equals 的使用2 equals 方法的重写3 toString 的使用 2 JUnit单元测试的使用3 包装类面试题 4 static关键字的使用5 设计模式单例设计模式
  • 常用类String、时间日期类

    文章目录 1 String1 xff09 String内存解析2 xff09 String的使用3 xff09 String实例化4 xff09 图解两种创建字符串方式的区别5 xff09 图解字符串的存储6 xff09 图解字符串对象的存
  • 图书馆管理系统【SSM含SQL文件】

    项目源代码 https gitee com StarSea007 mylibrary ssm 编译环境 jdk 1 8mysql 5 0 及以上tomcat 8 框架 Spring 43 SpringMvc 43 Mybatis jar包管
  • Servlet及相关接口 【最全总结】

    1 Servlet 简介 1 xff09 从广义上来讲 xff0c Servlet 规范是 Sun 公司制定的一套技术标准 xff0c 包含与 Web 应用相关的一系列接口 xff0c 是 Web 应用实现方式的宏观解决方案 而具体的 Se
  • springmvc请求参数绑定 | 中文乱码 | 自定义类型转换器

    1 绑定的机制 表单中请求参数都是基于 key 61 value 的 SpringMVC 绑定请求参数的过程是通过把表单提交请求参数 xff0c 作为控制器中方法参数进行绑的 例如 xff1a span class token operat
  • 转发与重定向【面试题】

    请求转发与重定向 请求转发和重定向是 web 应用页面跳转的主要手段 xff0c 应用十分广泛 xff0c 所以我们一定要搞清楚他们的区别 1 请求转发 1 xff09 第一个 Servlet 接收到了浏览器端的请求 xff0c 进行了一定
  • 路径问题:相对路径与绝对路径

    1 提出问题 创建 Web 应用 Path xff0c 目录结构如图所示 在 a html 中有超链接 lt a href 61 34 b html 34 gt To b html lt a gt 如果先直接访问 a html xff0c
  • PyTorch:torch.Tensor.repeat()、expand()

    目录 1 torch Tensor repeat 2 torch Tensor expand 1 torch Tensor repeat 函数定义 xff1a repeat sizes Tensor 作用 xff1a 在指定的维度上重复这个
  • Cookie学习笔记

    1 cookie 简介 1 1 什么是 cookie cookie xff0c 有时我们也用其复数形式 cookies xff0c 是服务端保存在浏览器端的数据片段 以 key value 的形式进行保存 每次请求的时候 xff0c 请求头