当前位置: 首页 > news >正文

快速理解基本的cookie、session 和 redis

一、Cookie

1、什么是Cookie

1、Cookie实际上是一小段的文本信息,是一种key=value形式的字符串。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。
2、当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
3、cookie 只存储用户的身份标识,如用一串字符串表示的 userid;服务器端通过 session 存储用户信息,然后用 userid 去查找对应的用户信息。
4、Cookie是客户端(浏览器)存储数据的一种机制,键值对结构,可以存储身份信息,也是可以存储关键的信息,都是程序员自定义
5、Cookie是浏览器提供的一种让程序员在本地存储数据的能力,让数据在客户端这边更持久化。

2、会话Cookie和持久Cookie

1、会话cookie(内存式Cookie)
若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
2、持久Cookie(硬盘式Cookie)
若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie。

3、Cookie具有不可跨域名性

你在逛B站时生成的cookie,不会被带到CSDN的cookie中。

4、Cookie的工作原理

浏览器里面存的Cookie都是从服务器的响应“报头”里面的 set-cookie 字段中来的,每个 set-cookie 字段里面都包含一个Cookie 这样的键值对,浏览器拿到响应之后就会把 set-cookie中的内容保存到本地,而 set-cookie 就是程序员自己在服务器中构造填写的。

在这里插入图片描述

注意:
1、修改和删除cookie

  • 要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。
  • 修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
  • 从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。

2、配置域名

  • domain参数必须以点(“.”)开始。另外,name相同但domain不同的Cookie是两个不同的Cookie。如果想要两个域名完全不同的网站共有Cookie,可以生成两个Cookie,domain属性分别为两个域名,输出到客户端。

3、配置允许访问Cookie的路径

  • 设置为“/”时允许所有路径使用Cookie。path属性需要使用符号“/”结尾。

4、配置cookie的安全属性

  • secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。
  • 如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。

二、Session

1、什么是Session

1、Session是另一种记录客户状态的机制,不同的是 Cookie保存在客户端浏览器中而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以Session记录在服务器上。
2、session 运行在服务器端,当客户端第一次访问服务器时,可以将用户的登录信息保存;当用户访问其他界面时,可以通过 session 判断用户的登录状态,做出提示。
3、Session是服务器存储数据的一种机制,键值对结构的,主要用来 存储身份相关的信息

2、Session的工作原理

Session在调用getSession()或者getSession(true),底层都会自动实现Set-Cookie方法,这意味着使用
session会生成cookie存放JSESSIONID
【getSession()或者getSession(true) 返回的是key=value的cookie键值对】

在这里插入图片描述

注意:
1、getSession(Boolean)

  • 如果参数是true,就会看看请求中是否会有 SessionId,以及SessionId合不合法。
    1、如果有SessionId,就会根据这个SessiuonId找到对应 HttpServlet 对象(查hash表),在服务器这边以一个hash表的形式,把若干个Session给组织起来;
    2、如果没有SessionId,那么服务器就会生成一个SessionId,同时创建一个HttpServlet 对象,把这一组键值对再插入到服务器管理的Session的hash表中,同时把 sessionId,通过Set-cookie 在响应中返回给客服端
  • 如果参数是false,也是会看请求中是否有SessionId,以及是否合法,如果有SessionId,直接找到对应的 HttpServlet对象,查询各方面的信息,如果没有SessionId,那么直接返回就是null

2、保存session id的方式

  • 1.使用Cookie进行保存(默认机制);2.URL重写;3.表单隐藏字段

3、Session的生命周期和有效期设置

  • Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简
  • 由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
  • 注意:< session-timeout >参数的单位为分钟,而setMaxInactiveInterval(int s)单位为秒。

疑惑:对于Session和Cookie的关系
回答:Cookie是在客户端存放Session的;调用Session本身就会用到Cookie(工作原理),如果不想用也可用另外两种方式实现(不建议,最好使用Cookie)。

3、Cookie和Session的区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

三、Redis

1、什么是Redis

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

2、为什么要用Redis(Session为什么要结合Redis使用)

实际的项目中,需要部署在多台服务器上,防止某台服务器的压力过大,避免出现系统性能问题或宕机。

eg1.举例说明(只用session和cookie)
对于登录系统,用户主要访问我们nginx的代理服务器请求系统。
如果用户第一次请求被分配到了服务器A,创建的Session对象就是在A的内存中,返回给用户的Cookie是JSESSIONID=abc123;用户第二次请求用Cookie找到值为abc123的session就不需要再次登录了,但是,第二次请求分配到了服务器B,拿着abc123在B的内存中根本没有,就会出现请求失败,用户就得再次输入密码才能登录,用户体验就很差。
在这里插入图片描述

eg2.举例说明(使用redis实现session共享)
加入redis后,用户第一次请求的session被存放到Redis中,即使第二次请求到了服务器B,也可以从redis查到对应的session。
PS:感觉Redis就是单纯的替代了每个服务器存储session,实现共享。
在这里插入图片描述

Session为什么要结合Redis使用

  1. 分布式数据存储
    Session数据保存在内存中,如果有多个Web服务器组成的集群,那么Session数据就会分散在各个服务器上,导致Session数据无法共享。Redis的主要作用是支持分布式数据存储,因此可以解决这个问题,让多个Web服务器上的Session数据共享。
  2. 高性能
    Redis是一种高性能的内存数据库,它可以处理大量的读写请求,使得Session数据的读写速度大大提高,从而提升Web应用程序的性能。
  3. 支持持久化存储
    Redis支持将数据持久化到磁盘中,确保Session数据不会因为服务器宕机或关机而丢失。这样可以最大程度上保障用户数据的安全性和可靠性。
  4. 支持高并发
    由于Redis的高并发性能,可以支撑大量用户同时访问Web应用程序,从而提高并发用户数的处理能力,减少了Web应用程序出现瓶颈的风险。
  5. 强大的扩展能力
    Redis支持丰富的数据结构和功能,可以根据需要扩展和定制Session管理的功能,让Session管理更加灵活和高效。

3、简单扩展

3.1 什么叫做缓存穿透?如何解决?

是指缓存和数据库中都没有数据,导致所有的请求都落到数据库上。数据库短时间承受大量的请求而崩掉
在这里插入图片描述
解决:
1缓存取不到,数据库也取不到的数据, 设置为key—null 的方式
2布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap 中去(它告诉你存在的话不能全信,其实有可能是不存在的,不过它他要是告诉你不存在的话,那就一定不存在)

3.2 什么叫做缓存击穿?如何解决?

高并发查询同一条数据,但是redis 中的数据过期了。导致请求发送到了数据库,造成缓存击穿
在这里插入图片描述
解决:
1设置热点数据永不过期;
2使用互斥锁。分布式情况下使用分布式的锁

3.3 什么叫做缓存雪崩?如何解决?

缓存同一时间大面积的失效,后面的请求都会落到数据库上,造成数据库短时间内承受大量的数据请求在这里插入图片描述
解决:
缓存数据的过期时间随机设置,防止同一时间大量的数据过期的情况发生

3.4 Redis查询为什么很快?

虽然redis是单线程程序,但是因为它是纯内存数据库,只操作内存(而我们的mysql是硬盘操作),并且使用了异步非阻塞IO(单线程+多路复用IO模型)

3.5 什么是多路复用IO?

当一个请求访问redis时,redis去取数据给这个请求的时间段内,请求的入口不是阻塞的,也就是说依旧可以接收请求,直到redis取到数据,再一一响应这些请求。
多路:多个socket连接,复用:复用一个线程
多路I/O复用技术可以让单个线程高效的处理多个连接请求(尽量的减少网络IO的时间消耗)。

3.6 为什么单线程查询速度能这么快?

首先,单线程肯定不可能比多线程快,但是单线程的模式避免了数据并发安全(因为多线程的数据并发安全,所以出现了各种锁)。那么这个时候我们单线程的优点就来了:不需要考虑数据并发的安全,也不用出现频繁的线程调度,切换上下文。

3.7 上下文是什么?

线程每次执行时都需要将数据从主内存读入到工作内存中。当线程阻塞时,工作内存的数据就需要被放到线程上下文中,其实线程上下文就是一个存储结构,当线程被唤醒的时候,就去读取上下文的内容,就称为切换上下文。

3.8 主内存和工作内存是什么?

主内存(Main Memory)是用于计算机内部存储和访问数据的一种硬件设备,通常指的是随机访问存储器(RAM)。它在计算机启动时被激活,并且一直运行到计算机关闭。主内存通常是存放程序和数据的地方,因此也被称为程序级存储器(Programmable Memory)。在主内存中,数据存储在内存单元中,每个内存单元具有一个唯一的地址。

工作内存(Working Memory)通常是指线程(Thread)执行时使用的缓存区域,也被称为线程的本地内存(Thread Local Memory)。每个线程都有自己的工作内存,线程的工作内存中存储了该线程独享的变量副本(Copy),工作内存中的变量副本会被操作后写回主内存。多个线程之间可以访问共享的数据,如果一个线程要访问共享的变量,它会先将变量从主内存复制到自己的工作内存中,然后对变量进行操作,最后将变量的值写回到主内存中。

需要注意的是,多个线程互相之间不能看到各自工作内存中存储的数据,这些数据只会在各自的工作内存和主内存之间传递。因此,为了确保线程间的数据一致性,Java 提供了一些同步机制,如 synchronized 关键字和 Lock 接口,当一个线程需要访问共享的数据时,需要先获取锁,保证其他线程暂时无法修改该数据,然后才能进行操作。这些同步机制确保了数据在多个线程之间的可见性和一致性,避免了并发访问时的数据竞争和错误。

在这里插入图片描述

read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。
write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

==================================
本文参考了以下文章,他们的描述更加详细:

Cookie 和 Session
Cookie和Session的区别(面试必备)
Cookie和Session详解
Session和Cookie的区别与联系

【nodejs学习笔记】用户登录相关:cookie、session 和 redis的使用和优缺点
Node.js坑点杂谈(二)快速弄懂session和redis
session + redis 实现session 共享原理和原因
session与cookie的理解(sso、redis)
redis详解(全)
Redis 详解

相关文章:

快速理解基本的cookie、session 和 redis

一、Cookie 1、什么是Cookie 1、Cookie实际上是一小段的文本信息&#xff0c;是一种keyvalue形式的字符串。客户端请求服务器&#xff0c;如果服务器需要记录该用户状态&#xff0c;就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。 2、当浏览器再请求…...

STANet代码复现出现的问题

1 IndexError: boolean index did not match indexed array along dimension 0; dimension is 4194304 but corresponding boolean dimension is 65536定位到导致错误的代码&#xff0c;是metric.py&#xff0c;Collect values for Confusion Matrix 收集混淆矩阵的值时出错 …...

Java 中String对象详解

Java语言中的String对象是一个非常常见的数据类型&#xff0c;大多数情况下我们都是在使用String对象来表示字符串类型的数据。Java中的String类是一个final class&#xff0c;它是不可被继承的。本文将对Java中的String对象进行详细全面的描述&#xff0c;包括以下几个方面&am…...

k8s nfs运行问题、etcd问题、calico网络问题

服务器重启后nfs运行问题导致服务不能正常重启 解决办法 在每个节点下使用如下命令进行查看nfs是否正常启动 systemctl status nfs 如果没有启动&#xff0c;则使用如下命令启动&#xff0c;保证三个节点下的nfs都正常启动 systemctl start nfs 再次查看nfs是否正常启动 syst…...

Qt--QString字符串类、QTimer定时器类

目录 1. QString 字符串类 dialog.cpp 2. 容器类 2.1 顺序容器 QList 示例代码&#xff1a; student.h student.cpp dialog.h dialog.cpp 运行结果&#xff1a; 2.2 关联容器 QMap 示例代码&#xff1a; dialog.h dialog.cpp 运行结果&#xff1a; 3. Qt类型 3.1 跨平台数据类型…...

2023.5.13>>Eclipse+exe4j打包Java项目及获取exe所在文件的路径

Eclipseexe4j打包Java项目及获取exe所在文件的路径 1、打包exe文件1.1 打jar包1.2 打包exe2、在程序中获取exe所在路径3、遇到问题4、JDK version和class file version(Class编译版本号)对应关系5、参考文章 1、打包exe文件 1.1 打jar包 右单击项目选择“Export…” 1.2…...

Centos系统的使用基本教程

Centos是一款流行的Linux操作系统&#xff0c;它基于Red Hat Enterprise Linux系统&#xff0c;是一款稳定、可靠、安全的操作系统。本文将介绍Centos系统的基本使用方法&#xff0c;包括安装、命令行操作、软件安装和系统管理等方面的内容。 安装Centos系统 Centos系统可以从…...

IDEA生成ER图、UML类图、时序图、流程图等的插件推荐或独立工具推荐

以下是几个常用的IDEA插件和独立工具&#xff0c;可以用于生成ER图、UML类图、时序图、流程图等&#xff1a; Visual Paradigm (独立工具) Visual Paradigm是一个强大的建模工具&#xff0c;可以生成UML类图、时序图、流程图等。它支持多种语言和框架&#xff0c;包括Java、Spr…...

Python心经(3)

这一节总结点demo和常用知识点 目录 有关字符串格式化打印的 lambda匿名函数&#xff0c;&#xff0c;将匿名函数作为参数传入 文件读写 生成器 python的装饰器 简单的网站代码&#xff1a; 有关三元运算 推导式&#xff1a; 新浪面试题&#xff1a; 有关面向对象里…...

单工,半双工,全双工通讯

对于点对点之间的通信&#xff0c;按照消息传送的方向与时间关系&#xff0c;通信方式可分为单工通信、半双工通信及全双工通信三种。 单工通信 单工通信&#xff08;Simplex Communication&#xff09;是指消息只能单方向传输的工作方式。 在单工通信中&#xff0c;通信的信…...

【2023-05-09】 设计模式(单例,工厂)

2023-05-09 设计模式&#xff08;单例&#xff0c;工厂&#xff09; 单例模式 顾名思义&#xff0c;就是整个系统对外提供的实例有且只有一个 特点&#xff1a; ​ 1、单例类只有一个实例 ​ 2、必须是自己创建唯一实例 ​ 3、必须给所以对象提供这个实例 分类&#xff…...

批量任务导致页面卡死解决方案

需求背景 需要基于高德地图展示海量点位&#xff08;大概几万个&#xff09;&#xff0c;点位样式要自定义&#xff08;创建DOM&#xff09;&#xff0c;虽然使用了聚合点&#xff0c;但初始化时仍需要将几万个点位的DOM结构都创建出来。 这里补充一句&#xff0c;高德地图在2.…...

避免“文献综抄”,5种写作结构助你完成文献综述→

很多作者可能有过这样的体验&#xff1a;读了很多文献&#xff0c;但在写综述的时候总感觉不像是在写文献综述&#xff0c;更像在写文献总结 如果引用方面不注意&#xff0c;甚至会成为文献综抄。 那么&#xff0c;你可以参考下我们整理的以下资料哦~ 01 文献总结和文献综述的…...

Java异常和反射

JAVA 异常分类及处理 概念 } final Entry<K,V> getEntryUsingComparator(Object key) { K k (K) key; // 获取该 TreeMap 的 comparator Comparator<? super K> cpr comparator; if (cpr ! null) { // 从根节点开始 Entry<K,V> p …...

Accesss数据库的那点事

Accesss数据库的那点事 1.Access的简介 Access&#xff08;全称为Microsoft Access&#xff09;是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;。它是由微软公司开发的数据库软件&#xff0c;用于创建、管理和操作数据库应用程序。 Access提供了一个可视化的开发环…...

网络基础学习:osi网络七层模型

osi网络七层模型 什么是OSI&#xff0c;什么是ISO?为什么ISO要提出OSI网络七层模型&#xff1f;OSI七层的划分以及具体内容第七层 应用层第六层 表示层第五层 会话层第四层 传输层第三层 网络层第二层 数据链路层第一层 物理层 每一层与设备的对应关系 什么是OSI&#xff0c;什…...

EndNote X9 引用参考 单击文献编号,不能跳转到文尾文献列表处,咋解决?文献编号 不能跳转 ,怎么办?

文章目录 1 正常情况下 引用文献编号 是可以跳转的2 问题分析3 解决方法4 EndNote X9 插入参考文献常见问题总结5 EndNote X9 快速上手教程&#xff08;毕业论文参考文献管理器&#xff09; 1 正常情况下 引用文献编号 是可以跳转的 正确的插入文献后&#xff0c; 正常情况下&a…...

用免费蜜罐工具配置Modbus工控蜜罐

导语&#xff1a;本文将用DecoyMini免费蜜罐工具来配置自定义的ModbusTCP工控仿真模板&#xff0c;并介绍部署后的Modbus蜜罐的使用效果。 DecoyMini是一个免费的蜜罐工具&#xff0c;其特色是仿真能力采用与软件松耦合的仿真模板来进行管理。通过一键式导入云端仿真模板库里的…...

DataGridXL中快速搜索单元格和底部全屏模式区域隐藏

DataGridXL表格是在2020年发布&#xff0c;DataGridXL在设计时就考虑到了性能。提供最快、最简单、最可靠的数据网格。DataGridXL支持所有常用所有的浏览器&#xff0c;为 Web 应用程序提供类似于 Microsoft Excel 的体验&#xff0c;它支持前端框架有Vue、React、Angular等。 …...

DotNet几种微服务框架,你用过吗?

最近有群友问&#xff0c;.NET有哪些微服务框架&#xff1f;.NET的微服务框架还真不多&#xff0c;一般企业都会自己搭建微服务框架&#xff0c;或者基于其它框架搭建微服务&#xff08;比如abp&#xff09;。本文将介绍几种微服务框架&#xff0c;供大家学习参考。 一、Servi…...

Nature | 生成式人工智能如何构建更好的抗体

疫情高峰期&#xff0c;研究人员竞相开发一些首批有效的COVID-19治疗方法&#xff1a;从已经康复的人的血液中分离出来的抗体分子。 现在&#xff0c;科学家已经证明&#xff0c;生成式人工智能&#xff08;AI&#xff09;可以通过一些繁琐的过程提供捷径&#xff0c;提出增强抗…...

【hive】基于Qt5和libuv udp 的lan chat

作者已经不更新了,但是很棒 在线用户列表: 聊天窗口 主程序 单独的网络线程: network_thread data管理关联网络管理的 程序update升级更新 和消息收到 即可...

Java版本工程项目管理系统源码,助力工程企业实现数字化管理

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…...

什么是零拷贝?

零拷贝 什么是零拷贝 零拷贝指的是&#xff0c;从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底层是 通过DMA总线技术实现的。零拷贝与具体的编程语言无关&#xff0c;完全依赖于OS&#xff0c;OS支持就可使用&#xff0c;不支持 设置了也不起作用…...

计算机专业含金量高的证书

目录 第一种证书&#xff1a;计算机技术与软件专业资格考试证书 第二种证书&#xff1a;微软认证 第三种证书&#xff1a;Oracle认证 第四种证书&#xff1a;思科认证 第五种证书&#xff1a;华为认证 第六种证书&#xff1a;红帽认证工程师 第七种证书&#xff1a;阿里…...

原装二手Keithley 2401低压源表 吉时利2401数字源表

Keithley 2401低压源表&#xff0c;20V&#xff0c;1A&#xff0c;20W Keithley 2401 低压源表提供精密电压和电流源和测量功能&#xff08;1V - 20V 和 10pA - 1A&#xff09;。它既是高度稳定的直流电源&#xff0c;又是真正的仪器级 5 位万用表。电源特性包括低噪声、精度和…...

gradle-8.1.1-all 快速下载百度网盘下载

Gradle 8.1.1 发布 这是Gradle 8.1的第一个补丁发布。 它修复了以下3个问题&#xff1a; 为配置缓存检测具有数千个lambdas的类时出现MethodTooLargeException&#xff1b;用Gradle 8.1构建的Kotlin DSL预编译脚本插件不能用于其他版本的Gradle&#xff1b;Gradle 8.1在buil…...

C#开发的OpenRA游戏之基地工程车部署命令产生过程

C#开发的OpenRA游戏之基地工程车部署命令产生过程 OpenRA游戏里,前面已经分析基地工程车部署的流程, 但那只是一个框架的流程,只能理解大体的框架, 如果想要深入一步了解怎么样产生部署命令,还需继续探讨以下的代码。 基地工程车是先选中,然后再在基地工程车上面点击右…...

C++ 智能指针的原理、分类、使用

1. 智能指针介绍 为解决裸指针可能导致的内存泄漏问题。如&#xff1a; a&#xff09;忘记释放内存&#xff1b; b&#xff09;程序提前退出导致资源释放代码未执行到。 就出现了智能指针&#xff0c;能够做到资源的自动释放。 2. 智能指针的原理和简单实现 2.1 智能指针的原…...

学习笔记——SVG.js中形状元素的创建及其相关方法

CreateElement 1&#xff09;创建svg元素 在svg.js中&#xff0c;每个元素都是一个对象&#xff0c;可以通过构造它来创建&#xff1a; import { Rect } from "svgdotjs/svg.js" var rect new Rect().size(100, 100).addTo(draw) // or to reuse an existing nod…...