程序员面试题!亲身经历!持续更新!

JAVA

  1. 为什么重写equal()的同时还要重写hasCode()

    • 为了提高效率,因为hascode比较是在equal比较之前执行的,假如说没有重写hasCode,现在set中有1万条数据,再写一条数据就会比较一万次判断是否重复,如果重写了hascode的话,然后通过hash算法看看给的地址的值是否有值

    • 防止如果equal的结果是true还能添加到set集合当中,比如我有一个person类值比较name,但是age不同,如果不重写hasCode的话,就会把两个person对象都添加到set中(因为hasCode不同,先比较的hascode)

参考博客

  1. ==和equal的区别

    1. 默认情况下==和equal是一样的
    2. 如果重写了equal方式,他就会按照自己写的逻辑比较
    3. String是系统重写了equal方法,所以按照写的方式比较
    4. 一般来说,我们一般用==比较基本数据类型,equal来比较引用数据类型
    
  2. abstract 和 interface

    1. 相同点
    	- 都不能被实例化
    2. 不同点
        - 抽象类可以有构造方法,但是接口中没有构造方法
        - 抽象类中的变量修饰符可以是任意的,但是接口的变量修饰符只能是public+static+final
        - 抽象类中的方法可以是抽象的,也可以是非抽象的,接口中的方法都是抽象的方法只能是pubic+abstract
        - 抽象类是用继承的方式实现,单继承,接口类的是用implements实现
    3. 有抽象类为什么还要有接口?
        - 抽象类式单继承,接口是多实现
        - 继承的方式容易发生类爆炸
        - +不同点,比如变量,方法等等
    4. 为什么有接口还有抽象类?
        - 抽象类中可以写一些个性的东西,接口只能写共性的东西
        - +不同点,比如变量,方法等等
    
  3. jdk和jre区别

    1. jdk是开发环境,
    	可以编译有javac.exe文件
    	jvisualVM可以监视cpu,线程的运行
    	javadoc.exe 生成开发文档
    	keytool.exe 密钥和证书的工具
    2. jre是运行环境
    	jre中主要有的是dll文件,动态链接库,供操作系统访问
    
  4. int和Integer的区别

    1. int 是基本数据类型,Integer是引用数据类型
    2. Integer主要可以解决类型转换的问题
    
  5. 基本数据类型有哪些并且为什么要定义这些基本数据类型

    1. byte,char,short,int,long,boolean,float,double
        1    2     2    4   8      1      4      8
    2. 每个基本数据类型都占有固定的存储空间,这样可以节空间
    
  6. 为什么字符串可以字面量赋值?

    1. 首先我们直到字符串是常用的,栈中运行是比较快的,但是字符串长度不固定,这样空间就很可能浪费,所以直接开一个常量池,来存放即可
    
  7. 保留字,关键字,标识符

    1. 保留字是系统保留的字,不能够使用,也是关键字
    2. 关键字是含有特殊意义的字
    3. 标识符就是我们定义的变量名等,命名规则是必须以字母下划线美元符号开头,可以跟数字字母下划线美元符号
    
  8. 为什么可以Integer b = 3;这样赋值

    1. 从jdk1.5之后就有了自动拆装箱,他就等价于Integer b = new Integer(3);自动装箱
    2. 自动拆箱是int a = b;
    
  9. 面向对象的三大特性

    1. 封装
    	- 就是将属性私有化并提供一个对外访问的接口,将数据保护起来
    2. 继承
    	- 就是子类拥有了父类非私有的属性和方法,并且可以重写,主要是提高代码的复用性
    3. 多态
    	- 父类引用指向子类对象,有继承,重写等特点,主要是可以提高代码的可替换性(可以替换已存在的代码),可扩展性(可以在父类的基础上在扩展子类),简化性,简化了代码的编写!
    
  10. short a = 1; a = a + 1; a += 1;哪个对?

    1. a = a + 1; 是错的因为1是整形,ashort,必须强转
    2. a += 1 ==> a = (short)(a + 1);
    
  11. 如何用sql语句获取系统当前时间

    1. select dataname(YY,getdate()) -获取年 sql server支持的
    2. select dataname(MM,getdate()) -获取月 sql server支持的
    3. select now(); mysql支持的
    
  12. 转发((forward))和重定向(sendRedirect)的区别

    1. 转发是服务器内部实现的,不透明,重定向是服务器外部实现的,透明的
    2. 转发是一次请求一次响应,重定向是多次请求多次响应
    3. 转发不可以跳转外网,重定向可以跳转外网
    
  13. arraylist和数组定义固定长度,超出下标赋值或者获取会发生声明结果

    1. ArrayList
    	添加不会报错,但是get获取会报错 IndexOutOfBoundsException
    2. 数组
    	添加和获取都会报错!ArrayIndexOutOfBoundsException
    
  14. 线程同步中,对象的锁在()情况下持有线程返回 ?B

    A:当synchronized()语句块执行完后
    B:当在synchronized()语句块执行中出现例外(exception)时
    C:当持有锁的线程调用该对象的wait()方法时
    D:以上都是
    
  15. 在java语言中,临界区可以是在一个语句块,或者是一个方法,用什么关键字标识

    synchronized
    
  16. 有关会话跟踪技术描述正确的是

    A:Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息发送到服务器端
    B:关闭浏览器意味着会话ID丢失,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期
    C:在禁用Cookie时可以使用URL重写技术跟踪会话
    D:隐藏表单域将字段添加到HTML表单并在客户端浏览器中显示
    
    答案:AC
    B: 关闭浏览器会话ID不会丢失
    D:此表单不在客户端显示
    
  17. 会话跟踪的四种方法

    1. url重写技术
    2. 隐藏表单域
    3. session 服务器端 无限制 安全 消耗性能
    4. cookie  浏览器端 最大4k 不安全
    
  18. servlet中设置HTTP响应类型为HTML网页,应使用那种contentType

    text/html
    
  19. get和post请求区别

    1. get和post请求其实就是Http协议的两种请求方式
    2. Http是根据基于tcp/ip的,tcp相当于一个运输的汽车,http相当于交通规则,贴标签的,比如get,post,http就限定,get吧数据放车顶(url,透明的)并限定2k大小,post数据放车厢(请求体中),安全
    3. get是发送一次数据包(header和data一块发送),post是发送两次数据包(一次header,一次data)
    
  20. 集合(答案待更新

    集合线程安全/不安全有序/无序
    ArrayList不安全有序
    LinkedList不安全有序
    HashSet无序
    TreeSet无序
    Queue
    Vector安全
    HashMap不安全
    TreeMap
    HashTable安全
    Properties
  21. 子类继承父类的静态代码块,代码块,构造的执行顺序

    class A {
        static {System.out.println("A1:父类静态代码区域");}
        { System.out.println("A2:父类非静态代码区域"); }
        public A() {System.out.println("A3:父类构造器");}
    }
    
    class B extends A {
        static {System.out.println("B1:子类静态代码区域");}
        {System.out.println("B2:子类非静态代码区域");}
        public B() {System.out.println("B3:子类构造器");}
    }
    
    // 测试类
    public class Test {
        public static void main(String[] args) {
            B b1 = new B();
            System.out.println("====");
            B b2 = new B();
        }
    }
    结果:
    A1:父类静态代码区域
    B1:子类静态代码区域
    A2:父类非静态代码区域
    A3:父类构造器
    B2:子类非静态代码区域
    B3:子类构造器
    ====
    A2:父类非静态代码区域
    A3:父类构造器
    B2:子类非静态代码区域
    B3:子类构造器
    
  22. servlet实现原理

  23. jsp的执行流程

    1. jsp本质上也是servlet,继承了HttpServlet
    2. 执行流程:jsp文件先转换成.java文件,在变成.class文件,最后执行!
    
  24. cookie和session

    1. cookie  浏览器端  不安全 4k
    2. session 服务器端  安全  无限制
    为什么要有cookie?
    cookie是来存储session发送的sessionId的
    因为web是没会话机制的,一次请求就会立马断开,再次请求的时候就不认识了,所以就有了cookie
    
  25. ArrayList和LinkedList区别

    1.ArrayList 是顺序存储,LinkedList是链式存储
    2.顺序存储查找比较快,但是插入,删除,修改慢
      链式存储查找比较慢,但是插入,删除,修改比较快
    为什么顺序查找比链式查找快?
        因为内存读取是每次读取连续的一小块区域,顺序存储的位置都是相邻的,而链式存储不一定是相邻的!
    
  26. 面向对象的六大原则

    1. 单一职责原则:一个类只负责一项职责!
    2. 开闭原则:对程序的扩展开放,修改关闭!
    3. 接口隔离原则:多个隔离的接口是比单个接口的耦合性低!
    4. 里氏替换原则:任何基类出现的地方,子类都可以出现!
    5. 迪米特原则:一个类尽可能的和其他类减少关系,最好是一个独立的模块!
    6. 依赖倒转原则:主要是针对接口编程,依赖抽象而不依赖与具体的实现!
    

    参考博客

  27. Java如何回滚?(答案不确定

    1、Connection conn = DataBaseFactory.getDataBase().getConnection();
    2、设置conn.setAutoCommit(false);
    3、只有执行conn.commit();才会一起提交,否则不会一起提交  conn.rollback(); 回滚方法
    

    参考博客

  28. 为什么使用接口降低了耦合性?

    1. 耦合性低就是删除调用层和接受层次无关
    2. 比如我们有一个UserService的接口和一个UserServiceImpl接口的实现类,当这个实现类的功能没用的时候直接把它删除就可以了!这就是为什么接口降低了耦合性!
    
  29. jsp/servlet内置对象

    1. application
    2. session
    3. request
    4. response
    5. page:当前对象
    6. pageContext:页面上下文对象
    7. response
    8. out
    9. config
    
  30. 常见的异常有哪些?

    1. 空指针异常:NullPointerException
    2. 类型转换异常:ClassCastException
    3. 数组下标越界异常:ArrayIndexOutOfBoundsException 	
    4. 文件未找到异常:FileNotFoundException
    5. 算术条件异常:java.lang.ArithmeticException
    
  31. final修饰的位置

    1. final 修饰的类不能被继承
    2. final 修饰的变量必须被赋值且不能被修改
    3. final 修饰的类不能被继承
    
  32. 集合的分类

在这里插入图片描述

  1. for循环的执行顺序

    首先初始化执行第一个参数,然后和第二个参数比较,如果满足条件,执行循环体,然后在执行第三个参数,继续判断即执行第二个参数,满足条件继续执行,不满足直接退出。然后循环执行!
    
  2. 跳出循环有哪几种方式

    1. break:跳出当前循环!
    2. continue:结束本次循环!
    3. return:结束当前方法,并返回!
    4. 打标记,跳出多重循环!break 标记;
    

    参考博客

  3. Arraylist和LinkedList区别

    1. ArrayList相当于一个动态增长的数组,LinkedList相当与一个双向链表
    2. 数组是按照索引连续存储,查找比较快,但是删除修改添加比较慢,而链表删除修改添加比较快,但是查询比较慢
    3. 为什么数组查询快那?因为内存读取数据的时候是按照连续的内存读取的正好符合数组的规范,所以数组查询比较快!
    
  4. set是如何保证唯一的,怎么让他不唯一

    1. set在添加的时候会自动比较equal和hashcode之后都不相同的时候才能被添加!
    2. 重写equal和hashCode,让equal返回false,hashCode返回一个不相同的数!
    
  5. 如何循环遍历数组或者集合

    1. for循环
    2. foreach
    3. Iterator迭代器
    增强for循环和for循环的区别?
    增强for循环底层是Iterator迭代器,主要是遍历集合和数组的,写法更加简单方便,但是没有下标!
    
  6. 线程的5中状态

    1. 创建状态
    2. 就绪状态
    3. 运行状态
    4. 阻塞状态
    5. 死亡状态
    
  7. 多线程callable和runable的区别?

    类别RunnableCallable
    返回值T类型
    能否抛出异常
  8. 线程池是什么,有什么优点?

    类似于一个池子,主要就是用来存放线程的!
    1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
    2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)
  9. jvm垃圾回收有哪些算法

    1. 标记清除算法
    2. 复制算法
    3. 标记整理算法
    4. 分代收集算法
    

    参考博客

  10. 什么时候会用到多线程?【有待更新

    主要就是高并发的时候会用到多线程,比如设计游戏的时候,多个任务角色,多个坦克等等,在比如,我们多个人同时购买火车票等等。
    
  11. java中创建对象的方式有哪些?

    1. new的方式,这种方式是最常见的方式
    2. 反射的方式,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
    3. 调用对象的clone方法
    4. 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
    
  12. 模拟验证码,为什么用画的方式?

    1. 防止机器操作
    2. 如何实现?
    	方式一:主要是用画笔画出来的,首先定义一个BufferImage(图片缓冲区),并且活得画笔,先画一个背景和颜色,然后通过随机数生成几个随机字符,并且通过画笔画到图片缓冲区上面,字符的颜色也是随机生成,然后把这些字符放到session中,最后通过ImageIO输出成图片!
    	方式二:利用kaptcha工具类定义验证的形状颜色等等,然后通过ImageIO的方式变成图片输出到页面上,比较可以直接取session中key值就可以了,kaptcha自动把值放到session中了!
    
  13. 忘记密码怎么修改密码,如何保证安全性?

    修改密码的时候用邮箱号和手机号码的唯一性来保证安全性。
    
  14. mybatis中怎么传递参数,并且怎么取他的值?

    mybatis传递多个参数
        1. 建议一个类封装他的属性参数,传递类即可
        2. 可以直接传递一个map,key是属性名
        3. 直接传递多个参数,取值用#{param1},#{param2}传递
    mybatis的sql语句如果返回多个参数
        1. 建立一个包装类,包含所有返回的属性  resultType直接返回这个类
        2. 用resultMap做映射关系
        3. 直接返回map就可以 取的时候key就是属性
    
  15. #{}和${}的区别

    1. #{}是预编译处理,相当于一个占位符,mybatis在处理#{}会替换成?,然后set的时候才会换成值,并且会加上单引号,有效的防止的sql注入,提高了系统安全性!
    2. ${}是字符串拼接,mybatis在处理${}会直接变量的值放进去,不会加单引号,可能能会造成sql注入,不安全!
    
  16. 排序有几种,怎么实现?是否稳定!

    在这里插入图片描述

口诀: 希快选堆不稳,堆快归快!

  1. 红黑树到底是什么?

    红黑树是特殊的平衡二叉树,可以保证查询,删除,添加之后的时间复杂度都是非常高效的,是O(logn)
    它具有以下性质:
    	- 节点不是红色就是黑色
    	- 根节点和叶子节点都是黑色的
    	- 每个红节点的子节点都是黑色的
    	- 任意一个节点到每个叶子节点的路径上的黑色节点数都是一样的
    因为它具有了以上的性质保证了,从根节点到叶子节点上的最长路径不可能大于最短路径的2倍!
    
1. 基础题
2. 线程题
3. 集合题
4. 异常题
5. 算法题
6. 虚拟机

JavaScript

  1. js的全局函数

    在这里插入图片描述

  2. 鲁棒性

    下列不属于Java语言鲁棒性特点的是
    A:java能程序在编译和运行时的错误
    B:Java能运行虚拟机实现跨平台
    C:Java自己操纵内存减少了内存出错的可能性
    D:Java还实现了真数组,避免了覆盖数据类型的可能
    
    解答:Java鲁棒性的特点如下:Java在编译和运行程序时都要对可能出现的问题进行检查,以防止错误的产生。Java编译器可以查出许多其他语言运行时才能发现的错误。Java不支持指针操作,大大减少了错误发生的可能性。Java具有异常处理的功能,当程序异常时,它能捕获并响应意外情况,以保证程序能稳妥地结束,计算机系统不会崩溃。而Java能运行虚拟机实现跨平台是Java的与平台无关性的特点。所以本题选B。
    
  3. js内置对象

    1. String
    2. Number
    3. Boolean
    4. Array
    5. Object
    6. Math
    7. Function 函数构造器
    8. Error
    9. RegExp
    10. Arguments 函数参数集合
    
  4. 看图说话

    <%= page==this %>// 结果是true
    <% int sum = 8;  %>
    <%! int sum = 1; %>
    <%= sum++ %> // 结果是8
    <%= this.sum++ %>// 结果是1
    

JQuery

  1. jq选择器中怎么选择上一个下一个父亲孩子

    $("p").prev();
    $("p").next();
    $("p").parent();
    $("p").children();
    

数据库

  1. 什么是事务

    在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
    在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
    
  2. 事务的四大特性

    A:原子性,要么全部完成要么全部不完成
    C:一致性,事务提交前后保持一致,如果A向B转100,不管转多少次他们总和不变
    I:隔离型,事务之间是相互隔离的
    D:一致性,一旦提交永久改变
    
  3. 事务并发产生的问题

    1. 脏读
    	读到未提交的数据,比如事务A修改了数据,还未提交,事务B就读取到了修改后的结构
    2. 不可重复读
    	一个事务范围内两次读取的结果不一样,比如事务A查询某条数据之后,事务B修改了,A又查询了却结果不一致(主要针对update)
    3. 幻读
    	根据相同条件查询的结果不一致(主要针对insert)
    
  4. 事务的四种隔离级别

    1. 读未提交
    2. 读已提交,可以解决脏读,oracle默认的隔离级别
    3. 可重复度,可以解决不可重复读,mysql默认的隔离级别
    4. 序列化,可以解决幻读,比较耗费性能
    
  5. 并发控制及解决方案

    1. 概念
    	就是多个用户进程线程同时操作的时候,可能会发生读读,读写,写写,读读没啥问题,那要是写的话是不是就造成问题了。
    2. 解决方案
    	悲观并发控制:相当于加了个锁,独占资源,锁又读写锁,读锁只能读,写锁能读能写。加锁又会造成死锁,如何解决?抢占资源+时间戳的方式来解决
    	乐观并发控制:不是加锁,而是利用并发的思想解决,例如时间戳等
    	多版本并发控制:创建多个版本并快速挑选
    
  6. 索引的分类

    1. 普通索引: 加速查询
    2. 主键索引: 加速查询+列值唯一且非空+只能有一个
    3. 唯一索引: 加速查询+列值唯一
    4. 组合索引: 加速查询+小于大于多个单个组合索引拆查询+遵循最左前缀集合(查询的第一个字段必须是建了索引)
    5. 全文索引: 主要就是查询关键字的
    
  7. 给字段起别名,where,group by 可以用吗?

    - mysql中可以where不可以用,但是group by和order by 可以用,并且mysql对查询做了优化,所以group by 可以用别名
    - oracle中只有order by 可以用
    主要原因是执行顺序
        (1)form...join...on
        (2)where
        (3)group by
        (4)分组函数
        (5)having
        (6)select
        (7)distinct
        (8)order by
        (9)limit
    
  8. having和where区别

    1. having是对分组后的数据筛选,where 是对分组前的数据进行筛选(因为执行顺序不同)
    2. having可以写分组函数,比如avg,sum等等,where不可以使用分组函数
    
  9. 如果优化sql?

    1. 首先考虑对where和having后面的字段建立索引
    2. 在where中避免使用容易造成全表扫描的东西,比如!=,in,是否为空,or等等
    3. 不要使用num/2=100,而是使用num = 100*2;
    

通用

1、/和./和…/

  • /:代表根目录,但是js中不适用

  • ./:“.”:代表当前目录

  • …/:“…”:代表上一级目录

算法题

  1. 分解质因数

    package com.neuedu.test;
    
    import java.util.Scanner;
    
    /**
     * 分解质因数
     * eg 90 = 2 * 3 * 3 * 5
     *
     * 什么叫质因数?
     * 该数既是质数,也是90的约数
     *
     * 思路:就是找约数的同时也找质数
     * 约数:number % k = 0
     * 质数:合数的第一个约数是质数
     */
    public class Demo_05 {
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            int number = scan.nextInt();
    
            System.out.print(number + "=");
            int k = 2;
            while (number != 1){
                // 判断k是不是约数
                // k不用判断指数,因为合数的第一个约数就是质数,并且k从小到大递增的
                if (number % k == 0){
                    number/=k;
                    if (number == 1){
                        System.out.print(k);
                    }else {
                        System.out.print(k + "*");
                    }
                }else {
                    k++;
                }
            }
        }
    }
    
  2. 判断字符串中的字符是否存在相同的

    package com.neuedu.test;
    
    /**
     * 判断字符串中的字符是否存在相同的
     *  eg: "abbc" 有相同的
     *      "abc" 没有相同的
     *
     *  思路:O(n)
     *      因为一般ascii理论上只有256个字符,所有如果s的长度大于256 必定有重复
     *      如果小于256,定义一个256长的boolean数组,默认false
     *      求每个字符的ascii 然后将对应的下标的 值改成 true 第二次还是true 的话则说明是相同的
     */
    public class Demo_06 {
        public static void main(String[] args) {
            String s = "abc";
            System.out.println(unique(s)?"没有相同的":"有相同的");
        }
        static boolean unique(String s){
            if (s.length() > 256){
                return false;
            }
            boolean[] b = new boolean[256];// 默认都是false
            for (int i = 0; i < s.length(); i++){
                int c = s.charAt(i);
                if (b[c]) return false;
                b[c] = true;
            }
            return true;
        }
    }
    
  3. 最大连续和

  4. 最少移动几次数组有序

计算机网络

  1. http协议有几层?

    物理层:定义传输介质的特性
    数据链路层程:定义单个路由的传输方式
    网络层:定义路由的实现方式
    传输层:选择差错恢复协议还是无参错恢复协议
    会话层:定义会话的开始,控制和结束
    表示层:定义数据的格式和加密
    应用层:应用之间的相互通信
    

必问

验证码:

  • 第一步是img中的src属性通过get方式请求controller层,
  • controller主要就是生成一个BufferedImage图片缓冲区,并获得画笔,同时设置画笔颜色和背景框,然后通过取不重复的字符串的下标,组成验证码的内容放到session当中,并且用ImageIO来输出图片。
  • 验证的话就是通过获取当前session中的值和用户输入的值进行比较,如果成功则执行后面的逻辑,否则告诉用户验证码输入错误!并刷新验证码
  • 还有一种方式就是利用kaptcha工具类,通过配置他实现自己想要的验证码效果,并且验证的话也是取session(String kaptchaExpected = (String)request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);

分页

  • 前台vue@next-click=“nextPage”,@prev-click=“prevPage”,@current-change=“currentPage”,@size-change=“sizeChangePage”
  • 后端用mybatis-plus的service层的page方法,把获取到的页面大小和当前页放到page类中,然后把page当作参数传递给page方法并获得Ipage返回给前端

编辑,怎么获取删除的数据

  • 通过scope的方式获取当前记录的信息

条件查询

  • 利用mybatisPlus的list方法,把条件放到QueryWrapper中即可

单表目录递归

  • 首先获取表中全部的数据
  • 获取一级导航
  • 遍历一级导航,找每一个一级导航的二级,然后再次调用该方法,找二级的三级导航!

批量删除

  • 每次选中复选框都会触发check事件,然后把选中的复选框的内容放到一个数组当中,当点击批量删除的时候把这个数组传递给后端
  • 后端通过所有要删除的数据的id放到list数组当中,然后调用mp的removeByIds方法把list放进去,或者调用自己手写的方法
  • delete from account where id in (1,2);

图片的上传

  • 利用CDN的方式进行图片上传
  • 首先通过传递COSCredentials和ClientConfig获取COSclient
  • 通过调用COSclient的putOjbect方法并传递桶的名称,key还有输入流来上传图片,最终返回一个上传成功的地址给前端!

级联

  • 通过递归的方式找到每个级联商品的子商品,然后利用JSON格式返回
  • 放输入直接给option即可,如果属性不对应可以通过prop上修改即可

token认证

  • 流程

    首先浏览器把用户名和密码传递给服务器

    服务器通过校验用户名和密码的合法性之后,把token返回给浏览器

    浏览器每次请求的时候都带上token,服务器端则校验token的合法性,来返回数据或者错误

  • 实现原理

    通过jwt的sign签名方法传递一个加密算法,获得一个字符串即token

    校验的话通过JWTVerifier的校验的方法来校验,如果不发生异常则校验成功,否则校验失败!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值