REST API Security
Spring Security
配置关于安全方面的设置,用@Configuration注解来注册一个security设置:
1234@Configurationpublic class DemoSecurityConfig { // 添加你的安全设置}
Spring Security Password Storage
在spring security中,密码可以用不同的方式存储:
id代表使用的加密算法, noop表示 "no operation"即保存纯文本密码,不适用加密算法。
在内存中保存用户、密码和角色
123456789101112131415161718192021222324252627@Configurationpublic class DemoSecurityConfig { @Bean public InMemoryUserDetailManager userDetailsManager() { UserDetails john = User.bulider() ...
REST CRUD APIs
Path Variables
在REST API 中 通过@PathVariable注释来指定要传入的参数,例子如下:
当前端访问url:/api/students/1的时候,就会返回studentId == 1的学生对象。
12345678910@RestController@RequestMapping("/api")public class StudentRestController { @GetMapping("/students/{studentId}") public Student getStudent(@PathVariable int studentId) { List<Student> theStudents = new ArrayList<>(); ... return theStudents.get(studentId); }}
默认情况下 @GetMapping("/ ...
Hibernate / JPA
什么是Hibernate
Hibernate是一个开源的对象关系映射(ORM)框架,它广泛用于Java应用程序中,用于处理数据库操作和数据持久化。Hibernate提供了一种将Java对象映射到数据库表的方法,并从数据库中检索这些对象,这样开发者就可以在编程时更多地关注于对象和数据之间的交互,而不是直接与SQL语句打交道
什么是JPA
JPA(Java Persistence API)是Java EE和Java SE环境中提供对象/关系映射(ORM)功能的一套规范。这意味着JPA自身不是一个框架,而是定义了一系列的API和概念,这些API和概念使得开发者能够以面向对象的方式来操作数据库中的数据。JPA的目标是简化现有的Java ORM技术,使得数据库操作更加容易管理和维护。
在Spring Boot中,hibernate是默认的JPA规范的实现。
@Entity
@Entity注释标识一个类为实体,通常会在下面再加上@Table(name = "tableName")注释来表示这个实体对应数据库中的那个表。对于属性,使用@Column(name="at ...
mysql
索引
索引分类
按数据结构
B+tree索引,Hash索引,Full-text索引
按物理存储
聚簇索引(主键索引),二级索引(辅助索引)
按字段特性
主键索引,唯一索引,普通索引,前缀索引
按字段个数
单列索引,联合索引
在创建表时,InnoDB存储引擎会根据不同的场景选择不同的列作为索引:
如果有主键,默认会使用主键所谓聚簇索引的索引键
如果没有主键,就选择第一个不包含NULL值的唯一列作为聚簇索引的索引键
在上面两个都没有的情况下,InnoDB将自动生成一个隐式自增id列作为聚簇索引的索引键
其他索引都属于辅助索引,也被称为二级索引。创建的主键索引和二级索引默认使用的都是B+Tree数据结构。
B+Tree
假如有以下的一张商品表
1234567CREATE TABLE `product` ( `id` int(11) NOT NULL, `product_no` varchar(20) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `price` decimal(10, 2) DEFAULT NULL, ...
面试回顾和知识点总结
字节飞书后端一面(10.20日)
组合索引最左匹配原则
单核多线程时间片轮转
docker对开发带来了什么好处
redis
mysql怎么优化查询
java最新版本有什么更新
算法是怎么在项目中得到应用的
项目问题
频繁发送http请求是否是IO操作
爬虫怎么优化
反射是什么?动态代理是什么?如果不用动态代理能用其他方式完成相应的功能吗。
go 和 java的不同
项目中的爬虫是计算密集型还是IO操作密集型
设计一个数据结构,传入一个包含不同字符串的字符串数组到该数据结构中,调用boolean search(String searchWord)来判断能否只改变searchWord的一个字母使得它匹配传入字符串数组的任意一个字符串。
面经
面经总结
http 和 https
HTTP是应用层协议,是一个无状态协议。服务器不维护任何有关客户端过去所发请求的消息。
HTTPS是HTTP的加强安全版本。HTTPS是基于HTTP的,也是用TCP作为底层协议,额外使用SSL/TLS协议用作加密和安全认证。默认端口号是443.
SSL指安全套接字协议。
HTTPS加密的方式是:
SSL利用对称加密加密传输的消息。而传输的密钥使用非对称加密,保证密钥的安全性。而密钥的安全性则保证了对称性加密的安全性。
为了保证密钥传输的依赖性,CA证书和数字签名被用来验证传输的可靠性。
HTTP/1.0、HTTP/1.1
HTTP/1.1、HTTP/2.0
DNS
DNS解析过程
TCP与UDP
TCP三次握手和四次挥手
三次握手
建立一个 TCP 连接需要“三次握手”,缺一不可:
一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后 ...
SpringBoot
SpringBoot
Maven
什么是Maven
Maven 是一个项目管理工具。当建立一个项目的时候,我们可能需要很多额外的JAR依赖文件。一种方式是我们需要什么就自己去网上下带,然后放到项目相应的路径下。如下图:
使用了Maven之后,Maven会帮你去网上下载你需要的依赖,并保证他们在编译运行期间可以使用。
Maven是如何工作的
Maven拉取依赖项的流程如下:
Maven首先读取项目配置文件,看看需要什么依赖项
然后先检查本地缓存库,看看是否有可用的依赖项
然后连接到远地资源库去拉取本地没有的依赖项,并存入本地库
最后用本地缓存的依赖项build and run
Application Properties file
Read data from: application.properties
12@Value("${valueName}") // valueName 就是在application.properties中的想读取的值的名字,通过这个形式就能注入到下面的fieldsName变量中private String ...
Java反射
Java 反射
静态代码 vs 动态代码
静态代码
通常,在编写程序时,在编写和编译阶段,所有类名、方法名和变量名都是静态已知的:
1Foo myObject = new Foo();
如果Foo类不存在,java编译器将会返回错误。
2. 动态代码
我们也可以创建没有Foo静态符号名名的对象,这有时称为动态编码:
1Object myObject = Class.forName("Foo").getConstructor().newInstance();
这种代码即使Foo这个类不存在,编译器也不会报错而只会在运行阶段报错,抛出ClassNotFoundException的错误
反射
反射是程序在运行时检查其自身结构的能力。
反射API
每个类、接口还有类型(包括基本类型)都都有对应的Class对象来获取他们的元数据。Class对象是反射API的主要入口
获取一个Class对象
调用getClass()方法1Class<?> c = "Hello World".getClass();
用.class来获取类文字1Class& ...
设计模式
设计模式
创建型模式
创建型模式是涉及如果创建程序中的对象的设计模式
单例模式(Singleton)
当你有一个全局的对象需要在系统的不同地方使用,例如一个数据库,一些操作都是在该数据库上进行。因为数据库带有全局的属性,所以你只想要该数据库的一个实例。
总结来说,当出现以下情况时,你可以考虑使用单例模式:
一个类只需要一个实例,但不清楚系统的那一部分应该拥有或者管理该实例时。
你希望该实例在代码中随处可用。
实例仅在第一次使用时才进行初始化(延迟话初始)
例如,数据库只需要连接一次,当在其他地方需要使用该数据库连接实例时,直接返回该数据库实例就好。
123456789101112131415161718192021222324252627import java.util.Objects;public final class Database { private static Database database; private Database() {} public static Database getInstance() ...
java多线程
Java多线程
线程
线程是程序同时并行执行多个任务的方式。可以将线程视为在程序内运行的迷你程序。每个线程独立执行自己的Java代码。
线程与内存
当线程创建的时候,内存会为每个线程分配一个单独的堆栈。这样每个线程可以独立于其他线程执行自己的代码。但要注意的是,堆内存只有一个,这些线程都共享一个堆空间,所以他们可以共享堆中的对象。
线程池
线程池是用于高效执行和管理异步工作的线程集合。线程池通过将线程存储在工作线程池中来降低使用线程的成本。这样,程序可以重用现有线程而不是为每项需要完成的工作创建一个新的线程。新工作被添加到工作队列中,并在其中等待池线程变得可用。当线程可用时,它将从队列中删除工作并执行该工作。
创建一个线程池
创建一个只有一个线程的线程池
1ExecutorService pool = Executors.newSingleThreadExecutor();
创建一个线程缓存池(没有数量限制)
1ExecutorService pool = Executors.newCachedThreadPool();
在这个线程缓存池中,线程会被复用。如果线程中的线 ...