- 博客(104)
- 收藏
- 关注
原创 【CORS】前端、后端 跨域配置
在这里强烈建议每个人通读一下 MDN 的HTTP访问控制HTTP 访问控制 ,这篇图文并茂的文章可以解决跨域百分之八十的疑惑。
2023-04-18 17:06:51
1387
1
原创 【Oauth2.0 单点登录 + 第三方授权认证】用户认证、授权模式
用户在访问每个微服务时,都需要验证身份信息,如果每一个微服务都登录一次就太麻烦了。因而用户在一个微服务系统中登录后,不用登录也可以访问其他微服务,这个功能就叫单点登录 。简单来说就是**用户只需要登录一个微服务系统就可以免登录访问其他微服务系统**
2023-04-04 19:55:04
3072
原创 【GoF 23 概念理解】AOP面向切面编程
AOP是一种编程范式,提供了一种从宁一个角度来考虑程序结构以完善面向对象编程(OOP)AOP是一个思想上的变化——主从换位,让原本主动调用的模块变成了被动等待,甚至在毫不知情的情况下被织入了很多新的功能。弥补了面向对象编程OOP的不足。在开发中,我们考虑问题都是纵向的,也就是默认都是从上到下,上层依赖下层。拿我们最熟悉的三层架构来说,也是从上到下来考虑的,通常都是表现出调用逻辑层,逻辑层调用数据层。
2023-04-02 09:38:44
568
原创 【Vue 响应式数据原理】数据双向绑定原理
vue 2 通过设定对象属性getter/setter方法来监听数据的变化,同时getter也用于依赖收集,而setter在数据变更时通知订阅者更新视图。vue 对JavaScript数组的方法进行了二次封装(重写)来劫持这些方法,在原有操作数据的基础上,添加了将数据响应到页面的功能。,外部所有的访问都必须通过这层拦截,通过这层拦截可以做很多事情,比如对数据进行过滤、修改或者收集信息之类。Proxy,字面意思是代理,是ES6提供的一个新的API,用于修改某些操作的默认行为,可以理解为。
2023-03-24 10:39:02
479
原创 【网络攻防】xss 脚本注入、csrf 跨域请求伪造
结尾的文本(字符串)。实体常常用于显示保留字符(这些字符会被解析为 HTML 代码)和不可见的字符(如“不换行空格”不需要你做任何的登录认证,他会通过合法的操作(比如: url 中输入,在评论框输入),向你的页面注入脚本(可能是 js、html 代码块等)。,编码的作用是将一些字符进行转义,使得浏览器在最终输出的结果上是一样的。对用户输入的数据进行 HTML Entity 编码(字符转义编码)。在未退出 A 网站的前提下访问 B,B 网站使用 A 网站的。移除用户输入事件和相关的属性。
2023-03-24 09:28:08
673
原创 vite 跨域配置
跨域一般出现在开发阶段,由于线上环境前端代码被打包成了静态资源,因而不会出现跨域问题。跨域可以在前端通过 代理服务器实现,也可以通过后端配置请求头实现,具体情况具体选择。若线上环境跨域则只能通过后端配置请求头解决。
2023-03-22 20:23:28
7296
原创 【vite 自动配置路由】
手动配置路由,是一个没有技术含量又浪费时间的工作。本文将介绍 vite 构建的 vue3 项目如何编写一个自动配置路由的脚本。
2023-03-22 20:16:18
740
原创 【Vue 源码解析】Vue实例挂载过程
源码位置:node_modules/vue/src/core/instance/index.js(ps:找不到可以在node_modules目录下搜索,因为懒惰后边就不写node_modules/vue这两级目录了)源码位置:/src/platforms/web/entry-runtime-with-compiler.js。方法,但我们发现本文件中并没有此方法,但仔细可以看到文件下方定定义了很多初始化方法。源码位置:src\platforms\web\runtime\index.js。
2023-03-18 10:36:47
690
原创 【最佳实践之性能篇】编码惯例与作用域意识
尊重对象所有权就意味着不要修改不属于你的对象。简单来说就是,如果你不负责创建和维护某个对象及其构造函数或方法,就不应该对其进行任何修改。具体来说就是遵循以下惯例:- 不要给实例或原型添加属性- 不要给实例或原型添加方法- 不要重定义已有的方法问题在于,假如有一个stopEvent()的方法用于取消某个事件的默认行为,你将其修改了,除了取消事件的默认行为还添加了其他行为,别人对于你添加的副作用并不知情,也使用了这个方法,就会导致别人出现错误或损失。
2023-03-14 20:42:14
230
原创 【JavaScript】this对象
this是一个特殊的对象,他在标准函数和箭头函数中又不同的行为。在标准函数中,this对象会在运行时绑定到执行函数的上下文,如果在全局函数中调用,则this在非严格模式下指向window,在严格模式下等于undefined。如果作为某个对象的方法调用,则this等于这个对象(因而this的指向需要看函数在哪里调用,而非在哪里定义)。这时候通常称其为this值
2023-03-14 11:35:52
229
原创 【JavaScript】原型、原型链与继承
(原型链)继承链:在子类实例的原型上创建父类实例,父类的构造器指向了上一级原型。原型也可能是一个实例,原型的原型又调用其父类构造器创建实例,其父类构造器指向了上一级原型,以此内推直到原型指向Object.prototype对象为止。
2023-03-13 21:05:05
424
原创 【JavaScript】垃圾回收与内存管理(内存优化)
我们以函数正常生命周期为例,函数中的变量会在函数执行时存在,当函数执行完毕时,就不再需要哪些局部变量了,它占用的内存就可以释放掉,供后面的使用。而在引用计数策略下,objA和objB在函数执行结束后依然存在,因为它们的引用数永远不会变成0.如果函数被多次调用,则会导致大量的内存永远得不到释放,为此引用计数就被弃用掉了,转用标记清理策略,事实上引用计数的问题还不于此,但这里就不作介绍了。这种策略也被称为词法作用域,因为变量的作用域是由代码中变量声明的位置决定的,而不是有代码执行时的上下文决定的。
2023-03-13 16:22:18
805
原创 【JavaScript】执行上下文与作用域、作用域链
执行上下文(简称上下文)在编程语言中是一个极为重要的概念。它是一个包含执行时所需信息的数据结构,包括全局执行上下文和函数执行上下文等。变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。每个上下文的数据和函数都保存在一个与之关联的变量对象中,虽然无法直接通过代码访问变量对象,但是后台处理数据的时会用到它们。
2023-03-13 10:56:02
520
原创 【GoF 23】篇5:代理模式
为其他对象提供一种代理以控制对这个对象的访问迪米特法则告诉我们:只与你的直接朋友交谈,不跟“陌生人”说话。保证A-B-C链式调用,不要A直接与C通信。缺点就是B有点冗余,但重点还是要保证系统结构清晰。也就是说对象A要不应该直接操作对象C,应该操作对象B,由对象B去对对象C进行同样的操作。代理模式分为:静态代理、动态代理。
2023-03-11 17:06:37
327
原创 【GoF 23】篇4:原型模式
原型模式简单来说就是将原对象拷贝一份,然后在副本上进行相应的操作,但是原对象不会产生任何变化,可以提高效率。在JavaScript中Object对象就是所有对象的顶级原型,所有对象都有一个原型即Object,原型是JavaScript实现继承的基础。原型链就是对象逐层继承的一个链式。原型链就是描述一些列原型对象的继承关系的链式结构。原型的实现是基于拷贝的,但是注意是**深拷贝**,至于为什么我想不必我多言。原型链的理解很简单,这里就不作代码演示。>注意:copy和new是有区别的。>- n
2023-03-11 16:24:08
107
原创 【GoF 23】篇3:抽象工厂
提供一个创建一系列相关或互相依赖的对象接口,而无需指定它们的具体类。抽象工厂是一个超级工厂,是其他工厂的工厂,或将简单工厂进一步抽象。这样来理解:我们将科技公司可以做的事情简要枚举出来,生产手机、电脑、路由器等等,比如小米、华为、联想等公司都可以生产这些产品。这里,我们就可以将科技公司可以生产的产品全部在一个接口中枚举出来,这个接口就可以看作一个抽象工厂。而小米、华为、联想这些公司就是普通工厂。抽象工厂将普通工厂可以生产的产品进行抽象出来。这里有两个概念:产品簇、产品级。
2023-03-11 15:58:07
398
原创 【GoF 23 概念理解】IoC/DI(控制反转/依赖注入)
参与者都有谁?依赖:谁依赖于谁?为什么要依赖?注入:谁注入于谁?到底注入什么?控制反转:谁控制谁?控制什么?为何叫反转(有反转就有正转了)?
2023-03-11 08:53:28
544
2
原创 【GoF 23】篇2:工厂方法
工厂方法类似简单工厂,只不过将对象实例化延迟到了子类来实现。工厂方法定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类。好处:在父类不知道具体实现的情况下,完成自身功能的调用;而具体的实现延迟到子类来实现。
2023-03-10 21:14:59
160
原创 【JavaScript运行原理之V8引擎】V8引擎解析JavaScript代码原理
V8 是一个接收JavaScript代码,并编译代码,执行代码的一个C++程序,编译后的代码可以在多种操作系统,多种处理器上运行。V8的工作:编译执行js代码、处理调用栈、内存分配、垃圾回收。
2023-03-10 17:38:44
1289
原创 【浏览器渲染原理】
js阻塞:但是在解析过程中遇到script标签时,就会停止html解析,转而去加载解析并执行js(因为浏览器并不知道当前的js操作会不会改变当前的html结构,如果js代码里用例document.write()来修改html,那么之前的解析就都没有意义了,所以我们一定要把script标签放在合适的位置,或者使用async或deffer属性来异步加载执行js);很多应用程序都是多进程的结构,这样是为了避免某一个进程卡死,影响整个应用程序,因为进程之间相互独立,一个进程卡死不会影响用户使用另一个进程。
2023-03-10 13:51:00
323
原创 【GoF 23】篇1:简单工厂模式
接口的思想:- 根据接口的作用和用途,浓缩下来就是“**封装隔离**”。- 通常提到的封装是对数据的封装,但是这里的封装是指“对被隔离体的行为的封装”,或“对被隔离体的职责的封装”;- 而隔离指的是“外部调用和内部实现的隔离”,外部只能通过接口调用方法,外部调用是不知道内部具体是怎么实现的,- 也就是说外部调用和内部实现是被接口隔离开的。使用接口的好处:- 由于外部调用和内部实现被接口隔离开了,那么只要接口不变,内部实现的变化就不会影响到接口内部,从而使得系统更灵活,具有更好的扩展性和可维护
2023-03-09 21:12:27
325
原创 【GoF 23】23种设计模式与OOP七大原则概述
1. **开闭原则:** 对扩展开放,对修改关闭。也就是在扩展功能时,不能去修改原有的代码,而是在原有的代码基础上进行功能扩展。2. **里氏替换原则:** 继承必须确保超类所拥有的性质在子类中任然成立。尽量添加新的方法来实现新的功能,不要重写父类的方法来实现功能,否则程序的可复用性就会变差,在多态的场景下程序也会出现错误。3. **依赖倒置原则:** 要面向接口编程,不要面向现实编程。高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象,这样就降低了程序的耦合度。4
2023-03-09 17:05:21
690
原创 【Java代码与架构之完美优化】篇1:代码质量优化通用准则
long类型的变量定义,都需要在后边跟上小写l或大写L,而小写l与数字1十分形似,难以分辨,者大大降低了程序的可读性,因而在定义long类型变量的时候,统一使用大写的L来标识变量。
2023-03-08 19:49:49
573
原创 【JDK8 新特性】Optional类
Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。如果值存在,则isPresent()方法会返回true,调用get()方法会返回该对象。,Google在著名的Guava项目引入了Optional类,通过检查空值的方式避免空指针异常。受到Google的启发,Optional类已经成为Java 8类库的一部分。也就时提供了一个备用方案,若传入的数据为null,则使用备用方案。Optional提供很多有用的方法,这样我们就不用显式进行。
2023-03-08 15:50:20
270
原创 【JDK15 新特性】密封类
在 Java 中如果想让一个类不能被继承和修改,这时我们应该使用 final 关键字对类进行修饰。不过这种要么可以继承,要么不能继承的机制不够灵活,有些时候我们可能想让某个类可以被某些类型继承,但是又不能随意继承,是做不到的。Java 15 尝试解决这个问题,引入了 sealed 类,被 sealed 修饰的类可以指定子类。这样这个类就只能被指定的类继承。通过密封的类和接口来限制超类的使用,密封的类和接口限制其它可能继承或实现它们的其它类或接口。
2023-03-08 15:30:36
272
原创 【JDK 17 新特性】jdk8~jdk17新特性
局部变量的显示类型声明,常常被认为是不必须的,因而JDK10允许开发人员省略通常不必要的局部变量类型声明,以增强Java语言的体验性、可读性,使用对变量进行。有了该功能,可以减少Java程序中显式强制转换的数量,实现更精确、简洁的类型安全的代码。直接在 switch 上支持 Object 类型,这就等于同时支持多种类型,使用模式匹配得到具体类型,大大简化了语法量,这个功能很实用。JDK13中引入了yield关键字,用于返回值并结束循环,而break只能结束switch循环,不能有返回值。
2023-03-08 15:29:29
1210
原创 【JDK14 新特性】Record
record的设计目标是提供一种将数据建模为数据的好方法。它也不是 JavaBeans 的直接替代品,因为record的方法不符合 JavaBeans 的 get 标准。另外 JavaBeans 通常是可变的,而记录是不可变的。尽管它们的用途有点像,但记录并不会以某种方式取代 JavaBean。
2023-03-08 15:17:39
772
原创 【JDK1.8 新特性】Stream API
① Stream 自己不会存储元素。② Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。③ Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。即一旦执行终止操作,就执行中间操作链,并产生结果。④ Stream一旦执行了终止操作,就不能再调用其它中间操作或终止操作了。
2023-03-08 11:35:55
384
原创 【JDK1.8 新特性】方法引用,构造器引用
针对情况1:函数式接口中的抽象方法a在被重写时使用了某一个对象的方法b。如果方法a的形参列表、返回值类型与方法b的形参列表、返回值类型都相同,则我们可以使用方法b实现对方法a的重写、替换。注意: 此方法是实例方法,需要对象调用!针对情况2:函数式接口中的抽象方法a在被重写时使用了某一个类的静态方法b。如果方法a的形参列表、返回值类型与方法b的形参列表、返回值类型都相同,则我们可以使用方法b实现对方法a的重写、替换。注意: 此方法是静态方法,需要类调用!针对情况3:函数式接口中的抽象方法a在被重写
2023-03-07 17:55:21
473
原创 【Java】函数式编程与JUC编程问题?函数式编程如何解决线程安全问题?
函数式编程可以通过使用不可变数据和纯函数来解决线程安全问题。不可变数据是指一旦创建就不能被修改的数据,这样可以避免多个线程同时修改同一个数据造成的竞态条件。纯函数是指没有副作用的函数,即对同样的输入始终产生相同的输出,这样可以避免多个线程之间共享状态造成的问题。在函数式编程中,由于数据全部都是不可变的,并且纯函数没有副作用,所以没有并发编程的问题,是多线程安全的。每一个纯函数都是线程安全,更容易被并行执行。总之,在函数式编程中使用不可变数据和纯函数可以有效地解决线程安全问题,并且使得程序更加容易被并
2023-03-07 11:39:22
376
原创 【JDK1.8 新特性】Lambda表达式
只包含一个抽象方法(Single Abstract Method,简称SAM)的接口,称为函数式接口。当然该接口可以包含其他非抽象方法。你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。在java.util.f
2023-03-07 11:28:39
390
原创 【Java】类的加载过程
过程1:类的装载(Loading)将类的class文件读入内存,并为之创建一个java.lang.Class的实例对象,此过程由类加载器完成。 过程2:链接(Linking)1. 验证(Verify):确保加载的类的信息符合JVM规范,例如:每一个class文件都以cafebabe开头,没有安全方面的问题。2. 准备(Prepare):正式为类中的(static)静态变量分配内存,并设置默认初始化值的阶段。这些内存都在方法区中进行分配。3. 解析(Resolve):虚拟机常量池内得符
2023-03-06 16:38:48
586
原创 【Java】序列化与反序列化
自定义类需要实现接口:Serializable(标识接口:无任何属性或抽象方法),否则会报NotSerializableException 异常要求自定义类声明一个全局常量:static long serialVersionUID = 42234234L;该常量必须是:static long 类型的,对权限修饰符没有要求该常量用于唯一标识该类,所以每个类的常量值都一样保持不一致要求自定义类的各个属性也必须是可以序列化的:对于基本数据类型:默认就可以序列化,因为底层已经实现类了Serializabl
2023-03-06 11:27:40
334
原创 【Java集合框架】篇六:Collections工具类
Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法(均为static方法):
2023-03-03 20:52:49
650
原创 【Java集合框架】篇五:HashMap、LinkedHashMap源码解析
jdk8中,我们调用空参构造器,创建实例时,底层没用立即初始化数组容量,在我们第一次put元素时,才初始化一个容量为16的数组table,并将元素添加到table(类似懒汉式)jdk8中,将内部类Entry改名为Node(名称合理化),意味着我们创建的数组式Node[],不再是Entry[]。jdk8中,key1和key2的哈希值和内容不同,则(key1,value1)与(key2,value3)构成单向链表,(key2,value2)指向(key1,value1)(尾插法)。因为头插法在多线程的情况下
2023-03-03 20:48:23
925
原创 【Java集合框架】篇四:HashSet、LinkedHashSet源码解析
无序性:Set底层存储元素不是从前往后依次存储的,而是通过元素的哈希值,计算元素的存储位置并保存,而遍历操作都是从前往后依次遍历的,进而导致遍历出来的数据和添加的数据的顺序不一致,体现为无序性!不可重复性:添加到Set中的元素不能相同,底层会通过元素的hashCode()和equals()进行判断,若二者都相同,则该元素一存在,不会重复添加
2023-03-03 17:18:30
566
原创 【Java集合框架】篇三:ArrayList、LinkedList源码解析
List:有序、可重复(“动态”数组);因而常常使用List替换数组,因为List 的容量是动态的。ArrayList:底层使用Object[]存储线程不安全,追加(尾部添加)、查找效率高。时间复杂度O(1)。删除、插入效率低。时间复杂度O(n)。默认容量10,自动扩容1.5倍。使用该类时,若数组容量确定尽量使用new ArrayList(int capacity)构造器,避免扩容操作。
2023-03-03 16:32:26
594
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人