我的随笔3

50.mysql 中表锁和行锁的区别

1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率高,并发度最低。
2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率低,并发度也最高。
3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

51.sql 锁的种类:乐观、悲观、排他,共享、意向锁

悲观锁: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次

在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁,一般多写的场景下用悲观锁就比较合适
乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于多读的应用类型,这样可以提高吞吐量
共享锁:又称读锁(S),对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源(也可以再继续加共享锁,即 共享锁可多个共存),但无法修改。要想修改就必须等所有共享锁都释放完之后。
排他锁:又称写锁(X),对某一资源加排他锁,自身可以进行增删改查,其他人无法进行任何操作。

52.自己设计数据库连接池时需要的参数。

初始化连接数量 initialSize
最大连接数 maxActive最大空闲连接数 maxIdle最小空闲链接数 minIdle空闲时间 maxWait

53.jvm、jdk、jre

jvm:java 虚拟机,负责把.class 二进制文件翻译成不同系统上的机器操作指令。
jre:java 运行环境,它包含了 java 虚拟机和 java 项目运行所需要的 java 类库,
java.util,java.sql,java.long,java.net 等

jdk:java 开发工具包,包含了 jre 和编译等开发 java 项目所需要的一些工具,如
javac.exe,java.exe,jar.exe 等,均放在 jdk 安装目录的 bin 目录下

54.Java 中的强引用、软引用、弱引用、虚引用有什么用

强引用:最普遍的引用,如 Object obj = new Object()
即时抛出 OutOfMemoryError 终止程序也不会回收具有强引用的对象通过将对象设置为 null 来弱化引用,使其被回收
软引用:对象处在有用但非必须的状态
只有当内存空间不足时,GC 会回收该引用对象的内存可以用来实现高速缓存
弱引用:非必须的对象,比软引用更弱一些
GC 时会被回收,不管内存是否足够
适用于引用偶尔被适用且不影响垃圾收集的对象
虚引用:不会决定对象的生命周期,任何时候都可能被垃圾收集器回收
跟踪对象被垃圾收集器回收的活动,起哨兵作用必须和引用队列 ReferenceQueue 联合使用

示例代码链接

55.GC

GC 即 java 垃圾自动回收机制,对内存中存在没有引用的对象或超过作用域的对象进行
回收。GC 垃圾回收的主要场所是堆
Java 虚拟机将堆内存进行了“分块处理”,从广义上讲,在堆中进行垃圾回收分为新生代、老年代和持久代三个区域;从细微之处来看,又将新生代分成了三个独立的区域,分别:Eden 区、From Survivor 区以及 To Survivor, 这三区域默认内存分配比例为 8(Eden):1(Survivor):1,每次使用 Eden 和其中一块 Survivor。
新生代主要使用复制和标记-复制算法,老年代主要使用标记-整理垃圾回收算法。
大多数情况下,对象在新生代 Eden 区中分配,当 Eden 区没有足够空间进行分配时,

虚拟机将发起一次 Minor GC [ˈmaɪnər];这时会把 Eden 区和 Sruvivor 中还存活的对象复
制到另一块 Survivor 区中,当对象在 Survivor 区熬过一定次数(默认配置是 15)的 Minor GC之后,就会晋升到老年代
同理,当老年代中没有足够的内存空间来存放对象时,虚拟机会发起一次 Major GC/Full GC,对年轻代、年老代和持久代的垃圾进行全面回收 ,过多的 GC 和 Full GC 是会占用很多的系统资源(主要是 CPU),影响系统的吞吐量。特别是 Full GC,因为它会对整个堆进行整理,所以我们应尽可能的避免 Full GC
持久代介绍:主要存放 java 类信息,或者通过 import 引入的类信息,这块空间中的内
存对象在代码运行时一般会长久存在

56.GC 的触发

(1) 老年代被写满
(2) 持久代被写满
(3) 程序员显式的调用了 System.gc()方法
(4) 我们可以通过 java 命令分配堆空间的运行策略,如设置年轻代和年老代的比例,如果虚拟机监测道上次 GC 后,这种运行策略发生的变化,也会触发 GC

57.判断对象可回收的依据

在 jdk 早期版本中,使用“引用计数法”来判断,就是当一个对象有一个强引用时,把该对象的引用数值加 1,反之则减 1,如果没有引用指向 1,它的引用计数值就是 0,在下次 gc 时,这个对象内存就会被回收
引用计数法优点是简单,但无法回收循环引用的对象,如 a 引用指向 b,b 指向 c,c 又指向 a,这种情况下,哪怕程序再也用不到他们,他们的引用计数值都是 1,始终无法被回收
所以后续版本中,引入了“根搜索算法”,就是从一个根节点开始寻找它所对应的引用节点,找到后继续寻找该该节点的引用节点,剩下的就是没有被引用的节点,也就是可以被回收的节点
可作为根节点的对象有如下 4 个:
(1) 虚拟机栈中引用的对象
(2) 本地方法栈中引用的对象
(3) 方法区静态属性引用的对象
(4) 方法区中常量引用的对象

58.ArrayList 和 Vector 有什区别?

ArrayList 是线程不安全的,当它初始容量不足时会以大概 50%的规模进行动态扩容,而 Vector 是线程安全的,它会以 100%的规模进行动态扩容。所以在单线程环境下,出于性能和内存使用量这两方面的考虑,建议使用 ArrayList
知识点:他们的初始容量在 jdk1.8 中是 0,在经过第一次 add 后为 10,在之前的版本中默认容量是 10.list 扩容是 (oldCapacity*3)/2+1

59.ArrayList 和 LinkedList 有什么区别?

ArrayList 是使用数组的方式来存储数据,在内存中分配连续的空间,它可以直接按序号索引元素,所以查找和修改的效率较高,但是插入、删除元素要涉及数组元素移动的操作效率较低
而 LinkedList 使用双向链表实现存储, 按序号索引数据需要进行前向或后向遍历,但是插入、删除数据时只需要记录本项的前后项即可,所以对于新增、删除元素较多的场景下,LinkedList 比较占优势。

60.List、Set、Map 是否继承自 Collection 接口?

List、Set 是,Map 不是。Map 是键值对映射容器,与 List 和 Set 有明显的区别,而 Set存储的是无序且不可重复的元素,List 是存储的是有序(保证了每个元素的插入顺序)且可重复的元素。

61.给我说一下你所了解设计模式?

设计模式就是一套被反复使用的代码设计经验的总结,它每种设计模式都给出了适用场景和解决办法,而且,通过应用设计模式及他们背后包含的思想可以优化系统结构,这样就可以用比较小的代价来添加新的需求或修改现有功能,设计模式能节省人力和时间上的成本,这才是价值所在
Java 中一般有 23 种设计模式,这些模式可以分为三大类:创建型模式、结构性模式、行为型模式,常用的设计模式有:工厂模式、代理模式、适配器模式、单例模式等
单例模式:单例模式
实现:一个班只有一个班主任
工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态)当得到子类的实例后,开发人员可以调用基类种的方法而不必关心到底返回的是哪一个子类的实例
实现:比如我们有一个动物类,它有一个行为!我们创建了鸟类、小狗类、鱼类,继承
了这个动物类,然后建一个工厂类,根据给定的不同信息,创建不同的子类。
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,使原本接口不兼容
的类可用一起工作
实现:1、美国电器电压为 110v,而中国的为 220v,那么美国的电器插头就不能插在中
国的插座上工作,中间要链接适配器
2、再比如耳机是 typeC 接口,手机是圆孔接口,要使用就得要适配器
观察者模式:对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
实现:比如用户关注的讲师,发布了一段视频,那么所有关注它的用户都能够收到通知。
代理模式:为其他对象提供一种代理,以控制对这个对象的访问实现:windows 里面的快捷方式、SpringAop
注意:具体实现你能否讲解你在项目中的使用场景设计模式简单汇总:

https://mp.weixin.qq.com/s?__biz=MzIwMTY0NDU3Nw==&mid=2651938221&idx=1&sn= 9cb29d1eb0fdbdb5f976306b08d5bdcc&chksm=8d0f32e3ba78bbf547c6039038682706a2 eaf83002158c58060d5eb57bdd83eb966a1e223ef6&scene=21

62.spring 用到的设计模式。

1、工厂模式:Spring 中的 BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得 Bean 对象
2、代理模式:AOP 底层就是动态代理模式的实现
3、单例模式:Spring 的依赖注入都是发生在 AbstractBeanFactory 的 getBean 里。getBean的 doGetBean 方法调用 getSingleton 进行 bean 的创建。

63.单例模式

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象常被设计成单例
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例
java 中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
饿汉式和懒汉式区别
饿汉就是类一旦加载,就把单例初始化完成,保证 getInstance 的时候,单例是已经存在的了,
而懒汉只有当调用 getInstance 的时候,才回去初始化这个单例。另外从以下两点再区分以下这两种方式:
1、线程安全:
饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,
懒汉式本身是非线程安全的,
2、资源加载和性能:
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都
会占据一定的内存
而懒汉式在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,
如果要做的工作比较多,性能上会有些延迟
3、实例代码:写一个单例模式

64.六原则一法则

  • 单一职责原则:一个类只做它该做的事情。

  • 开闭原则:软件实体应当对扩展开放,对修改关闭。- 依赖倒转原则:面向接口编程。

  • 里氏替换原则:任何时候都可以用子类型替换掉父类型。

  • 接口隔离原则:接口要小而专,绝不能大而全。

  • 合成聚合复用原则:优先使用聚合或合成关系复用代码。

  • 迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

65.String 和 StringBuilder、StringBuffer 的区别?

String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,
而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字
符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

66.HashMap(散列表)、HashTable、ConcurrentHashMap的介绍与区别

HashMap:底层数组+链表实现(JDK1.8+红黑树),可以存储 null 键和 null 值,线
程不安全
HashTable:底层数组+链表实现,key value 不能为空,线程安全,实现线程安全的方式是在修改数据时锁住整个 HashTable,效率低,ConcurrentHashMap 做了相关优化
ConcurrentHashMap:底层采用分段的数组+链表实现,线程安全通过把整个 Map分为 N 个 Segment[ˈsɛɡmənt],可以提供相同的线程安全,但是效率提升 N 倍,默认提升 16 倍。(读操作不加锁,由于 HashEntry 的 value 变量是 volatile 的,也能保证读取到最新的值。),ConcurrentHashMap 允许多个修改操作并发进行,其关键在于使用了锁分段技术
总结:HashMap 几乎可以等价于 Hashtable,除了 HashMap 是非 synchronized 的,并可以接受 null,而 ConcurrentHashMap 则是对 HashTable 做了相关优化

67.hashMap 工作原理

HashMa 使用 put(key, value)存储对象到 HashMap 中,使用 get(key)从
HashMap 中获取对象。
当我们往 Hashmap 中 put 元素时,首先会调用 key 的 hashcode 进行计算 hash值,再运用散列法得到这个元素在数组中的位置(下标), 如果该位置没有元素,就直接将该元素放到数组的该位置上。如果该位置上存放了其他元素,它会通过 equals 来比较他们的键值对是否相同,如果不同,则在这个位置上的元素将以链表的形式存放,新加入的放在链头,如果相同,则覆盖原来的值

需要注意 Jdk 1.8 中对 HashMap 的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率

68.concurrenthashMap 源码解析

ConcurrentHashMap 它也是 map 接口的实现者,是并发的,它是线程安全的。Hashtable 也是线程安全的 map 接口实现类,区别在于 Hashtable 使用
synchronized 关键字实现线程安全的,在线程竞争激烈的情况下 HashTable 的效率非常低下,而 ConcurrentHashMap 则开创性的使用了锁分段技术(假如容器里有多把锁,每一把锁用于锁容器其中的一部分数据,那么当线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率)
ConcurrentHashMap 是由 Segment 数组结构和 HashEntry[hæʃˈɛntri]]数组结构组成。Segment 继承可重入锁 ReentrantLock [rɪ’entrənt ],在 ConcurrentHashMap 里扮演锁的角色,HashEntry 则用于存储键值对数据类似于 HashMap。一个ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构和 HashMap 类似,是一种数组和链表结构, 一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry是一个链表结构的元素, 每个 Segment 守护者一个 HashEntry 数组里的元素,当对HashEntry 数组的数据进行修改时,必须首先获得它对应的 Segment 锁。
ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安全。这种划分是使用并发度获得的,它是 ConcurrentHashMap 类构造函数的一个可选参数,默认值为 16,这样在多线程情况下就能避免争用。

69.HashCode 和 equals 的区别

hashCode()方法和 equals()方法的作用其实是差不多的,都是用来对比两个对象是否相
等。
区别在于 equals()一般比较的比较全面比较复杂,但效率就比较低,而利用 hashCode()
进行对比,则只要生成一个 hash 值进行比较就可以了,效率比较高。
但 hashCode()并不是完全可靠,有时候不同的对象他们生成的 hashcode 也会一样如果两个对象的 equals 比较为 true,那么他们的 HashCode 一定相同,反之,两个对象

HashCode 比较为 true,但 equals 比较的结果不一定为 true
场景设想:Set 存储的是无序且不重复的值,那 Java 是如何判断他们不重复的呢?
如果使用 equals,那么里面有多少个元素就得比较多少次 equals,效率大大降低,于是就采用了 hash 表原理,当集合添加一个元素时,先调用它的 hashcode 方法,可以理解为定位到它所在的位置,如果该位置没有元素,则直接存放在该元素,如果该位置有元素,则使用equals 方法进行比较,相同的话就不存储了,不同的话散列到其他地址,这样调用 equals 的次数就大大降低了

70.装箱和拆箱在哪个环节转换

装箱:基本类型转变为包装器类型的过程。
拆箱:包装器类型转变为基本类型的过程。
它们在编译时转换的,我们可以反编译.class 文件得到具体内容
如装箱语句 Integer total = 99,class 文件则为 Integer total = Integer.valueOf(99)而拆箱时语句 int totalprim = total,class 文件则为 int totalprim = total.intValue()

71.类加载过程

1.装载:查找和导入 class 文件;
2.连接:
(1)检查:检查载入的 class 文件数据的正确性;
(2)准备:为类的静态变量分配存储空间;
(3)解析:将符号引用转换成直接引用(这一步是可选的)
这句话的意思是:符号引用只是一个字面量,在预编译阶段虚拟机并不知道所引用类的地址,所以用符号引用来代替,而这个阶段就是将符号引用转换成直接引用
3.初始化:初始化静态变量,静态代码块。
这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法 main()才会成为一般程序的入口方法。类的构造器也会引发该动作。
解说详细过程:
装载过程分为三步骤:
1、获取定义此类的二进制字节流,通过包名类名定位到 class 文件流,也可以自定义通过网络或者其他方式获取,通过这个性质,可以自定义类加载器实现热加载等等。
2、二进制字节流代表的静态存储结构转化成运行时方法区的数据结构,static 修饰的变

3、内存中生成 java.lang.Class 对象代表此类,作为方法区这个类的各种数据访问接口(java.lang.Class 也是对象但存储在方法区,不存储在堆)
检查(连接)
检查过程大致分为四大类,当然验证的逻辑不仅仅这些,详细过程方式不细讲。
1、文件格式验证:字节流是否符合 Class 文件规范
2、元数据验证:类描述是否符合规范
3、字节码验证:语义定义是否符合规范
4、符合引用验证:根据全限名是否能找到类等等

准备(连接)
正式为类变量分配内存和初始化(类变量可以理解为 static 修饰的变量),初始化是把变量赋值为数据类型的零值(java 中基本类型的默认值是 0,引用类型会默认为 null),除非被 final 修饰的类变量,会直接初始化为指定值。
解析(连接)
将常量池内的符号引用替换成直接引用的过程
初始化
类加载过程的最后步骤,根据程序员的主观计划去初始化类变量和其他资源,执行 clinit方法过程,根据编写的代码对类变量进行赋值等操作,执行父类、子类的 static 变量和 static静态块,注意如果是接口,不用执行父类的 static 变量和 static 静态块,除非子类用到父类的 static 变量和 static 静态块。

72.解释 JVM 加载 class 文件的原理机制

Java 中的所有类,都需要由类加载器装载到 JVM 中才能运行。类加载器本身也是一个类,而它的工作就是把 class 文件从硬盘读取到内存中。这些都是隐式装载的,我们不需要关心,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。
Java 类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到 jvm 中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。
Java 的类加载器有三个,对应 Java 的三种类:
Bootstrap ClassLoader // 负责加载系统类 (指的是内置类,像是 String,对应于 C#
中的 System 类和 C/C++标准库中的类)
Extension [ˌɪkˈstɛn(t) ʃ(ə)n] ClassLoader //负责加载扩展类(就是继承类和实现类) Application ClassLoader //负责加载应用类(程序员自定义的类)
三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类
加载器完成呢?为了解决这个问题,Java 采用了委托模型机制。
委托模型机制(双亲委派模型)的工作原理很简单:如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。这样可以避免重复加载。它还有一个安全上的考虑:如果某人将一个恶意的基础类加载到 jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,因为针对 java.*开头的类,jvm的实现中已经保证了这种类必须由 bootstrap 来加载,自然就不会将该类加载进来。
我们可以通过这样的代码来获取类加载器: ClassLoader loader = ClassName.class.getClassLoader(); ClassLoader ParentLoader = loader.getParent();
注意一个很重要的问题,就是 Java 在逻辑上并不存在 BootstrapKLoader 的实体!因为它是用 C++编写的,所以打印其内容将会得到 null。

73.JVM(Java 虚拟机)运行时内存模型。

Java 虚拟机把它所管理的内存划分为不同的数据区域,分别是方法区、堆区、程序

计数器、虚拟机栈、本地方法栈
堆区也是被所有线程共享的一块内存区域,一般来说它是 Java 虚拟机所管理的内存中最大的一块。此内存区域用来存放对象实例。也是垃圾收集器管理的主要区域。为了更好地回收或更快地分配内存,将堆区分为了新生代和老年代;新生代中又细分为Eden 空间、From Survivor 空间、To Survivor 空间等
方法区是被所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用。平时通过反射获取到的类型、方法名、字段名称等信息就是从方法区获取到的
虚拟机栈是线程私有的,它的生命周期与线程相同,它描述的是 Java 方法执行的内存模型。每个方法执行的同时会创建一个栈帧,用于存储局部变量表、操作数栈(用于计算的临时数据存储区)、动态链接(符号引用在运行期间转化为直接引用)、方法返回地址等信息,每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程
本地方法栈与虚拟机栈类似,区别在于虚拟机栈执行的是 java 方法(也就是字节码服务),而本地方法栈则为执行虚拟机中的 native 本地方法(通过这些可以调用 Java以外的程序,例如 c 语言写的程序)。
程序计数器可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、线程恢复等基础功能都需要依赖这个计数器来完成。

74.各种数据的存储位置

类型 示例 存储位置
静态变量 static int val = 1 方法区
New 出来的对象 String a = new String(“123”) new 出的对象在堆区,指向堆
区的引用 a 放在栈区
基本数据类型 int iVal = 100 值 100 在栈区, iVal 的引用
也在栈区
常量类数据 String a = “abc” 常量池在方法区中

总之记住:
(1) new 出来的对象存在于堆区,而这些 new 出来对象的引用则在栈区
(2) 类似于 String a = “abc”;之类的常量存在于常量池中,而常量池存在于方法区中

75.为什么 TCP 连接时是三次握手,而关闭时却是四次挥手

三次握手:
第一握:首先客户端发送一个 syn,请求连接
第二握:服务器收到之后确认,并发送一个 syn ack 应答
第三握:客户端接收到服务器发来的应答之后再给服务器发送建立连接的确定,至
此连接完成。

用比喻来说就是: C:约么? S:约? C:好的 这样就可以约会了

四次挥手:

第一挥:客户端发送断开连接的 FIN 报文,表示要断开 TCP 连接
第二挥:服务器收到客户端发来的请求后,回复 ACK 报文,表示已经收到消息第三挥:服务器回复完成后,先确认数据是否传输完毕,完毕后再发送 FIN 给客
户端
第四挥:客户端关闭连接
因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK报文。
但是关闭连接时,当 Server 端收到 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以只能先回复一个 ACK报文,告诉 Client 端,“你发的 FIN 报文我收到了”。只有等到我 Server 端所有的报文都发送完了,再发送 FIN 报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN一般都会分开发送,从而导致需要四次握手

字段 含义

ACK 确认号是否有效,一般置为 1。

SYN 请求建立连接

FIN 希望断开连接。

76.关于 token 的理解

Token 是在服务端产生的。
如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会
返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。
一般是我们在进行登录和请求数据的时候,都需要 token 值,在请求拦截器里,把token 值写入 header 里面,这样的话,我们每次在进行数据获取的时候,也就带有 token值了。而且 token 值也是在我们进行页面鉴权的时候必须要有的。。

77.BIO,NIO 和 AIO

NIO 是同步非阻塞 IO(JDK1.4 以上版本提供),跟 IO(也称 BIO)的区别是:
它是面向缓存的,可以跳跃性和重复读取,而 IO 是面向流的,只能顺序的从流中获取数据
它是非阻塞性的,而 IO 是同步阻塞性的,如调用 InputStream.read()中,IO 得等到读取到数据(或超时)时,才会继续往下执行
示例:NIO 的简单使用

78.什么是反射

反射是指在程序运行时动态获取和操作当前程序,比如获取类(class)的名称、实例化一个类实体、操作属性、调用方法等。

79.http 协议介绍

HTTP 超文本传输协议,不依赖于任何特定语言,,它构建于 TCP/IP 协议之上,
是一个应用层协议,默认端口号是 80 HTTP 的应用价值在于传输,它是无状态协议基于请求/响应模型
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求服务器会认为新的客户端,
规范把 HTTP 请求分为三个部分:请求行、请求头、消息主体
HTTP 响应也由 3 个部分构成,分别是:响应行、响应头、响应正文

HTTP 请求信息(浏览器信息)
1、 请求行:请求方式 + 请求 URL + 请求协议/版本号

Get /login.html HTTP/1.1

2、请求头:客户段浏览器告诉服务器的一些信息
User-Agent:浏览器信息
Accept:客户端能接收的数据类型Accept-encoding:是否支持压缩的流Accept-charset:客户端字符编码集
3、空行:分割请求头和消息体
4、消息主体:封装 POST 的请求参数
HTTP 响应信息(服务器发给客户端的数据)
1、 响应行:请求协议/版本+ 响应状态码 + 描述信息

HTTP/1.1 404 请求路径没有对应的资源

2、响应头(格式: 头名称:值):content-text:服务器发送信息的类型date:发送时间
server:服务器类型
3、响应空行
4、消息体:服务器发送给客户端的页面内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值