youyichannel

志于道,据于德,依于仁,游于艺!

0%

首先这个答案是否定的,Spring只是解决了单例模式下属性依赖的循环问题,Spring为了解决单例的循环依赖问题,使用了三级缓存。

阅读全文 »

HTTP Cache 的实现方式

对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对 「Request - Response」 的数据缓存在本地,那么下次再次发起相同的请求,就不必要再通过网络获取服务器的响应了,很显然,这将大幅提升性能。

因此,避免发送 HTTP 请求的方法就是通过缓存技术,在 HTTP 协议头中就有不少是针对于缓存的字段。

HTTP 缓存的实现方式:

  • 强制缓存
  • 协商缓存
阅读全文 »

GET 和 POST 的区别

RFC文档:

  • GET:https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.1
  • POST:https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.3

根据 RFC 文档规范,GET 的语义是从服务器获取指定的资源,资源形式没有限定,可以是静态文本、页面、图片、视频等等。

GET 请求参数一般是写在 URL 中的,URL 只支持 ASCLL 编码,所以 GET 请求的参数只允许是 ASCLL,像一些中文就会被转义,而且浏览器会对 URL 的长度有限制,但是 HTTP 协议本身对 URL 长度并没有做出任何规定。

根据 RFC 文档规范,POST 的语义是根据请求负荷(报文 Body)对指定资源做出操作,不同的资源类型所属的操作方式也不同。

POST 请求携带的数据一般是写在报文 Body 中,Body 中的数据可以是以任意格式存在的,只要 Client 和 Server 协商一致即可,而且浏览器也不会对 Body 的大小做出限制。

阅读全文 »

背景

首先思考一个重要的问题:如果我们为开发者提供了一个接口,却对于调用者一无所知,这是一件很恐怖的事情。

假设我们的 Server 只能够允许 100 个人同时调用接口。如果有攻击者疯狂请求这个接口,这是很危险的。一方面可能会损害我们的安全性,另一方面也可能耗尽 Server 性能,影响正常用户的使用。

因此我们必须为接口设置保护措施,例如限制每个用户每秒只能调用十次接口,即实施请求频次的限额控制。

如果在后期,我们的业务扩大,可能还需要收费。因此,我们必须知道谁在调用接口,并且不能让无权限的人随意调用。

那么现在,我们需要设计一个方法,来确定谁在调用接口。在我们之前开发后端时,我们会进行一些权限检查。例如,当管理员执行删除操作时,后端需要检查这个用户是否为管理员。那么,我们如何获取用户信息呢,是否直接从后端的 session 中获取?但问题来了,当我们调用接口时,我们有 session 吗?比如说,前端直接发起请求,没有登录操作,没有输入用户名和密码,这个时候怎么去调用呢?因此,一般情况下,我们会采用一个叫API签名认证的机制。这是一个重要的概念。

阅读全文 »

前言:

TCP 是面向字节流的协议,UDP 是面向报文的协议,如何理解「面向字节流」和「面向报文」呢?

之所以会说 TCP 是面向字节流的协议,UDP 是面向报文的协议,是因为操作系统对 TCP 和UDP协议的发送方的机制不同,也就是说问题原因是在发送方。

阅读全文 »

Spring 容器可以管理 Singleton 作用域的 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建、何时初始化完成、何时被销毁。对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器不再追踪其生命周期。

阅读全文 »

我们在学习 TCP 挥手的时候,学到的是需要四次来完成 TCP 挥手,但是,在一些情况下,TCP 也可以只有三次挥手。

  1. 为什么 RFC 文档中定义 TCP 挥手过程是 四次?
  2. 什么情况下会出现 三次挥手?
阅读全文 »

Base Env:

  • Hutool Core 5.8.25
  • JDK 8+

概览:

  • Collection<OrderItem> 转化为 List<OrderItem>
  • Collection<OrderItem> 转化为 Set<OrderItem>
  • List<OrderItem> 转化为 List<Long>
  • Set<OrderItem>转化为Set<Long>
  • Collection<OrderItem> 转化为 List<Long>
  • Collection<OrderItem> 转化为 Set<Long>
  • Collection<OrderItem>中提取 Key, MapValue 就是类型 OrderItem
  • Collection<OrderItem>中提取 Key, MapValue 根据 OrderItem 类型进行转化。
  • Map<Long, OrderItem> 中的 value 转化为 Map<Long, Double>
  • value 转化时,lambda 表达式可以使用(v)->{}, 也可以使用 (k,v)->{}
阅读全文 »