5 分钟快速上手图形验证码,防止接口被恶意刷量!
5 分钟快速上手图形验证码,防止接口被恶意刷量!大家好,我是程序员小白条,今天来给大家介绍一个快速实现图形验证码的优秀框架 AJ-Captcha。
需求分析如果注册接口没有验证码这种类型的限制,很容易会被刷量,因此,一般都会使用邮箱验证码或者图形验证码进行限制,防止被恶意刷接口。邮箱验证码比较容易的是 QQ 验证码,直接配合 SpringMail 即可实现,本文主要实现图形验证码。
文字验证如下
滑动验证如下
后端1)pom.xml 引入官方依赖包
<!-- 接入滑动验证 https://ajcaptcha.beliefteam.cn/captcha-doc/captchaDoc/java.html--><dependency> <groupId>com.anji-plus</groupId> <artifactId>spring-boot-starter-captcha</artifactId> <version>1.3.0</version></depende ...
TCP 的三次握手和四次挥手
计算机网络一块知识一直是大学生头疼的一块,而面试官却经常会考察这方面的知识,尤其是 TCP 三次握手和四次挥手,本文将对其进行图文分析。
TCP 的三次握手和四次挥手题目TCP 的三次握手和四次挥手
推荐解析目的TCP 是一种面向连接的协议,其三次握手和四次挥手的过程是为了建立和终止连接,保证通信的可靠性和完整性。
过程三次握手的过程是:
1)客户端向服务器发送 SYN 包( SYN = 1,表示请求建立连接),并进入 SYN_SENT 状态。
2)服务器收到 SYN 包,返回 SYN + ACK 包( SYN = 1,ACK = 1,表示确认请求并同意建立连接),并进入 SYN_RCVD 状态。
3)客户端收到 SYN+ACK 包,发送 ACK 包( ACK = 1,表示确认收到服务器的同意),并进入 ESTABLISHED 状态。
四次挥手的过程是:
1)客户端向服务器发送 FIN 包( FIN = 1,表示要关闭连接),并进入 FIN_WAIT1 状态。
2)服务器收到 FIN 包,返回 ACK 包( ACK = 1, ...
TCP 和 UDP 的区别是什么?
TCP 和 UDP 的区别是什么?题目TCP 和 UDP 的区别是什么?
推荐解析TCP 和 UDP 是两种网络传输协议,它们的主要区别在于它们的工作方式、性能和适用场景。
1)工作方式:TCP(Transmission Control Protocol)是一种面向连接的协议,需要在客户端和服务器之间建立一个连接,然后再进行数据传输。它提供了可靠的、有序的、全双工的数据流传输,通过确认、重传、窗口控制等机制来保证数据的可靠传输。TCP 是一种面向字节流的协议,数据是以数据流的形式传输的,没有数据报文的概念。
UDP(User Datagram Protocol)是一种无连接的协议,数据传输之前不需要在客户端和服务器之间建立连接。它提供了不可靠的、无序的、非全双工的数据包传输,不保证数据的可靠传输。UDP是一种面向数据报文的协议,每个数据报文都会被独立处理,不与其他报文建立任何关系。
2)性能:TCP 协议通过可靠性机制和拥塞控制来保证数据的可靠传输,因此它的传输速度相对较慢。UDP 协议没有可靠性机制和拥塞控制,数据传输的速度相对较快。
3)适用场景:TCP 协议适用于需要可靠传输、数 ...
什么样的字段适合加索引?索引失效了解吗?
什么样的字段适合加索引?索引失效了解吗?题目什么样的字段适合加索引?索引失效了解吗?
推荐解析适合加索引的场景1)主键字段:用于唯一标识每个记录的字段,通常是数据库表中的一个自增或唯一标识字段。
2)外键字段:用于连接两个表之间关系的字段,通常是一个表中的字段与另一个表中的主键字段关联。
3)经常用于查询的字段:如果某个字段经常被用于查询条件,例如用户的用户名、邮箱或订单的编号,那么为该字段添加索引可以提高查询性能。
4)经常用于排序的字段:如果某个字段经常用于排序操作,例如文章的发布时间或销售订单的日期,为该字段添加索引可以加快排序操作的速度。
5)经常用于连接操作的字段:如果某个字段用于连接多个表进行关联查询,例如用户表和订单表中的用户 ID 字段,为该字段添加索引可以提高连接操作的性能。
总结:Select、Where、Join、Order By 后面跟着的字段建议加索引。
不适合加索引的场景同样,我们需要知道什么样的数据不推荐加索引,索引提升的能力有限,甚至是倒退。
1)低选择性的列:低选择性的列指的是具有很少不同值的列。如果一列只有很少几个不同的值,那么为它添加索引可能不会提 ...
为什么是 MySQL 回表?
什么是 MySQL 回表?题目什么是 MySQL 回表?
推荐解析回表简介1)索引结构:MySQL 使用 B+ 树索引结构来加速数据的查找。B+ 树是一种多叉树,它的叶子节点中存储了完整的数据行,而非叶子节点存储了索引的键值和指向下一级节点的指针。
2)索引查询:当执行一个查询语句时,MySQL 会首先根据查询条件从 B+ 树的根节点开始进行查找,逐层下降直到找到满足条件的叶子节点。如果查询条件匹配了索引的键值,则可以直接从叶子节点中获取到完整的数据行,无需回表。
3)回表现象:在某些情况下,索引无法提供查询所需的所有信息,这时就需要进行回表操作。例如,如果查询语句需要返回的字段不在索引中,或者查询条件需要使用到索引之外的字段,就会发生回表现象。
4)回表过程:当发生回表时,MySQL 会根据叶子节点中的主键值再次去数据表中查找对应的数据行,以获取到缺失的数据。这个过程会增加额外的 IO 消耗和网络传输时间,降低查询性能。
5)回表优化:为了减少回表对性能的影响,可以采取一些优化措施。例如,使用覆盖索引来包含查询语句所需的所有字段,避免回表操作;或者使用索引的聚簇特性,将相关的字段放 ...
为什么 String 要设计成 Final 类?
为什么 String 要设计成 Final 类?题目为什么 String 要设计成 Final 类?
推荐解析1)只有当字符串是不可变的,字符串池才有可能实现
字符串池的实现可以在运行时节约很多 heap 空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么 String interning 将不能实现(注:String interning 是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。
String str1 = "Hello";String str2 = "Hello";System.out.println(str1 == str2); // 输出 true,因为字符串池中已经存在了 "Hello"
2)如果字符串是可变的,那么会引起很严重的安全问题
譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指 ...