Web后端
SpringBoot
Spring的快速开发脚手架,底层就是Spring+SpringMVC。
Spring
核心框架,提供IOC、AOP等基础功能
基本功能
IOC 容器(管理 Bean)
AOP(方法增强)
独立的实用功能模块
Spring Transaction
Spring 提供的数据库事务管理机制,用来保证一组数据库操作要么全部成功提交,要么全部失败回滚,保证数据一致性
使用
声明式
@Transactional
将当前方法交给Spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务
属性
propagation
事务传播行为
REQUIRED
默认值。需要事务,有则加入,无则创建新事务
REQUIRES_NEW
需要新事务,无论有无,总是创建新事务
SUPPORTS
支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED
不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
Spring Cache
Spring Task
SpringMVC
Spring 的Web子模块(spring‑web),专门负责Web层,处理HTTP请求、控制器、全局异常、参数解析。
组件
控制器增强组件
全局异常处理器
统一捕获Controller层抛出的异常,集中处理,不用在每个Controller写重复try‑catch,统一返回标准格式结果给前端
实现
@RestControllerAdvice
标记这是全局增强类作为全局异常处理器
@ExceptionHandler
标记在方法上,指定要拦截什么异常
Spring AOP
面向切面编程,是一种编程思想,把通用公共逻辑(日志、权限、事务、异常处理、耗时统计)和业务代码解耦,实现无侵入增强业务方法。
核心概念
连接点JoinPoint
程序中可以被拦截的位置,可以被AOP控制的方法
切入点Pointcut
匹配规则,筛选哪些连接点真正要拦截
切入点表达式
形式
execution(…):根据方法的签名来匹配
execution([访问修饰符] 返回值 [包名.类名.]方法名(方法参数) [throw 异常])
通配符
*:单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分。
..:多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数。
@annotation(…):根据注解匹配
@annotation(包名.注解名)
定义切入点表达式
通过方法上@Pointcut注解定义一个切入点表达式,则该方法的字符串可以作为切入点,@Pointcut(“要抽取出的切入点表达式”)
切入点表达式以字符串的形式作为通知注解的参数,多个切入点表达式可以使用与(&&)、或(||)、非(!)来组合比较复杂的切入点表达式
通知Advice
拦截到方法后执行的增强逻辑
通知顺序
当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行
默认顺序
默认按照切面类的类名字母排序:
目标方法前的通知方法:字母排名靠前的先执行
目标方法后的通知方法:字母排名靠前的后执行
自定义顺序
用@Order(数字)加在切面类上来控制顺序:
目标方法前的通知方法:数字小的先执行
目标方法后的通知方法:数字小的后执行
目标对象Target
被代理、被增强的原始业务对象
注解
@Around
环绕通知,此注解标注的通知方法在目标方法前、后都被执行
@Around环绕通知需要自己调用ProceedingJoinPoint.proceed()来让原始方法执行,其他通知不需要考虑目标方法执行。
@Before
前置通知,此注解标注的通知方法在目标方法前被执行
@After
后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行
@AfterReturning
返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行
@AfterThrowing
异常后通知,此注解标注的通知方法发生异常后执行
@Pointcut
抽取切点表达式,可复用,避免多处重复写表达式
Maven
Tomcat
HTTP
WebSocket
Redis
MySQL
Mybatis
Mybatis Plus
基于MyBatis的增强工具
使用
自定义的Mappeer继承MybatisPlus提供的BaseMapper<操作对象的pojo类>接口
自定义Service接口继承IService接口,自定义Service接口的实现类继承ServiceImpl<使用的Mapper类,操作对象类>
自定义SQL
利用MyBatisPlus的Wrapper来构建复杂的where条件,然后自己定义SQL语句中剩下的部分
条件构造器Wrapper
构造WHERE等条件作为自定义Mapper继承函数的参数使用
条件构造器封装抽象类AbstractWrapper,他是QueryWrapper(LambdaQueryWrapper)和UpdateWrapper(LambdaUpdateWrapper)的父类
customSqlSegment是 MP Wrapper 自动生成的 where 条件片段;在 XML 中用 ${Wrapper别名.customSqlSegment}引入,会自动把 Wrapper 中构造的 eq/in 等条件拼进 SQL,不需要手动写 where
静态工具类Db
静态调用单表 CRUD,不用注入 Service,解决 Service 循环依赖问题
枚举处理器
解决Java枚举类型与数据库字段之间的映射问题
MybatisEnumTypeHandler
数据库存数字编码(int),读出来是枚举对象
分页插件PaginationInnerInterceptor
注解
@Param
给 Mapper 接口方法参数起别名,让 XML / 注解 SQL 中通过#{别名}或${别名}获取参数MyBatis
@TableName
标记实体类对应数据库哪一张表,MP 默认开启驼峰命名转换
@TableId
标记实体属性为主键字段,MP 默认开启驼峰命名转换
@TableField
标记普通字段,实体属性和数据库字段映射,MP 默认开启驼峰命名转换
@EnumValue
标记枚举中哪个属性的值存入数据库
@TableField
描述实体类和数据库字段映射关系(枚举转换器)
Docker
开源的容器化平台,快速构建、运行、管理应用的工具
核心概念
镜像
静态、只读分层模板,打包程序、依赖、环境。不能运行,是创建容器的模板
容器
镜像的运行实例。镜像只读层 + 容器可读写层,拥有隔离的文件系统、进程、网络。可启停删除
仓库
存放 Docker 镜像的地方,用来镜像拉取、推送
数据卷
一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
Dockerfile
文本脚本文件,由多条指令组成,用来自动化构建 Docker 镜像
DockerCompose
用于定义和运行多个 Docker 容器的工具
Nginx
高性能的HTTP 和反向代理服务器
作用
反向代理:接收客户端请求,转发给后端服务;客户端只感知 Nginx,屏蔽后端真实地址。
负载均衡:多台后端服务器分发请求,提升吞吐量、做故障转移。
动静分离:静态资源 Nginx 直接处理,动态请求转发 Java 后端。
SSL 证书:配置 https,实现加密访问。
配置文件nginx.conf
http
所有网站、代理、负载均衡
upstream
负载均衡集群
存放后端服务集群列表,供反向代理引用并实现负载均衡
server
定义虚拟主机<br>
监听指定端口 + 匹配请求域名 ,接收客户端请求;请求进入该 server 块后,再由内部location匹配请求路径,处理或者转发请求。
location
匹配请求URL路径,实现反向代理、静态资源、缓存、压缩等逻辑
PageHelper
MyBatis分页插件,无需修改SQL语句即可实现分页功能
使用
在Service层中通过PageHelper.startPage(page,pagesize);给插件传递两个数据后,就可以按正常的查询全部数据的方式进行分页查询。<br>然后将查询返回的结果强转为插件提供的Page<E>,然后通过强转后对象的getTotal()和getResult()得到总记录数和分页查询结果的数据列表。
Swagger
基于 OpenAPI 规范的 API 文档工具,可自动扫描代码生成接口描述文件,自带 Swagger-UI 用于查看、调试接口
Knife4j
国内开源的 OpenAPI 增强 UI,基于 Swagger 生成的接口数据,替换原生 Swagger-UI,界面更友好,增加文档导出、搜索、接口分组等功能
注解
@ApiModel
作用于类上面的,是用来描述类的一些基本信息
@ApiOperation
作用于方法上面的,用来对某个方法/接口进行描述
@ApiModelProperty
用在属性上,描述属性信息
Lombok
Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量Logger
注解
@Slf4j
生成slf4j的Logger,SpringBoot默认日志、静态日志成员变量,日常开发最常用,省去手动编写获取日志对象的代码。
@Data
提供了更综合的生成代码功能(@Getter+@Setter+@ToString+@EqualsAndHashcode)
@NoArgsConstructor
为实体类生成无参的构造器方法
@AllArgsConstructor
为实体类生成除了static修饰的字段之外带有各参数的构造器方法
@Getter/@Setter
为所有的属性提供get/set方法
@ToString
会给类自动生成易阅读的toString方法
@EqualsAndHashCode
根据类所拥有的非静态字段自动重写equals方法和hashcode方法
Apache POI
Java 读写 Office 文件的开源库,项目里大多用来做 Excel 导入导出
功能
登录认证
概念
登录校验
接收前端发出的用户名和密码去数据库查询是否存在该用户,从而给前端响应不同的数据
登录标记
通过会话技术,用户登录成功之后,每一次请求中,都可以获取到该标记
统一拦截
在任何操作之前都要检查凭证查看用户是否登录,登录了则可以操作,没登录则向前端响应数据使其跳转到登录界面,避免不登录直接访问操作界面导致避开了登录功能
会话技术
概念
会话跟踪
解决 HTTP 无状态问题,服务器识别同一个客户端,保存用户状态的技术
方案
Session
服务端会话跟踪技术
使用
创建Session:当用户第一次访问网站时,服务器会为该用户创建一个Session,并生成一个唯一的标识符,称为Session ID
存储Session ID:服务器会通过Cookie或URL参数将Session ID发送给用户的浏览器
维护Session:浏览器会在每次请求时,将Session ID发送给服务器,服务器根据这个ID找到对应的Session,进而识别用户的状态
销毁Session:当用户注销、关闭浏览器或Session过期时,Session将被销毁,服务器不再保存用户的状态信息
缺点
集群多台服务器时,需要做Session共享;用户量大占用服务器资源
JWT令牌
一种用于网络传输、做身份认证的令牌格式
格式
Header(头)
令牌的类型和所使用的签名算法,使用Base64编码组成
Payload(有效载荷)
携带一些自定义信息、默认信息等,不放用户敏感的信息
Signature(签名)
防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来
校验
在请求到达服务端后,对令牌进行统一拦截、校验。<br>用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,都需要在请求头header中携带到服务端,请求头的名称为token,值为登录时下发的JWT令牌。如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法。
统一拦截
过滤器Filter
Java Servlet规范定义的组件,运行在Servlet容器(Tomcat)中;在请求到达Servlet之前、响应离开Servlet之后,对原始的 HttpServletRequest、HttpServletResponse`进行过滤处理
作用
Web容器层面,拦截全部请求和响应,完成底层通用处理(编码、跨域、防攻击)
使用
定义Filter
创建一个类,实现Filter接口,并重写其所有方法
配置Filter
Fliter类上加@WebFilter注解,配置拦截资源路径。
过滤器链
多个Filter组成一条链式结构
执行顺序:使用@WebFilter注解配置,按照过滤器的类名字母顺序执行
注解
@WebFilter
把自定义Filter交给Tomcat容器识别、加载
拦截规则
拦截具体路径
/login
只有访问/login路径时,才会被拦截
目录拦截
/eps/*
访问/emps下的所有资源,都会被拦截
拦截器Interceptor
Interceptor是SpringMVC框架提供的组件,在 DispatcherServlet`接收请求之后、Controller控制器执行前后进行拦截介入,属于Spring框架层面的AOP思想实现
作用
SpringMVC层面,拦截控制器,实现登录鉴权、权限控制、接口日志等业务功能
使用
定义拦截器
创建一个类,实现HandlerInterceptor接口,并重写其所有方式
注册拦截器
在继承WebMvcConfigure的类中,重写addInterceptors方法在其中添加拦截器配置拦截路径
拦截规则
registry.addInterceptor(自定义拦截器实例)<br> .addPathPatterns("/**") // 需要拦截的路径<br> .excludePathPatterns("/login","/register"); // 直接放行,不拦截<br>
一级路径/*
任意级路径/**
文件上传
客户端将本地文件通过HTTP发送给后端服务,后端接收文件二进制数据,选择本地磁盘存储或者阿里云 OSS 这类对象云存储完成文件保存,数据库记录文件访问地址的功能
配置
单个文件最大上传大小
spring.servlet.multipart.max-file-size
单个请求最大上传文件大小
spring.servlet.multipart.max-request-size
存储方式
本地存储
文件接收
通过MultipartFile类的对象进行接收
文件处理
重命名
MultipartFile类的对象(文件)调用getOriginalFilename()方法获取文件原名originalFilename
String newFileName= UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));构建唯一文件名
文件存储
MultipartFile类的对象(文件)调用transferTo(new File("文件夹路径\\"+newFileName))
云存储
阿里云OSS(Object storage Service)
概念
SDK
软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等
Bucket
存储空间,是用户用于存储对象的容器,所有的对象都必须隶属于某个存储空间
URL
统一资源定位符,互联网上资源的唯一访问地址,用来定位网络上的文件、接口、网页
使用
注册阿里云(实名认证)、充值、开通对象存储服务(OSS)、创建bucket、获取AccessKey(秘钥))->参照官方SDK编写入门程序->集成使用
RESTful
Representational State Transfer,表述性状态转移。一套软件接口设计风格(规范),SpringMVC 是支持实现Restful风格接口(@RestController、@RestControllerAdvice)
特征
设计思想:用HTTP方法表达动作,URL代表资源
GET:查询资源
POST:新增资源
PUT:修改资源
DELETE:删除资源
通过HTTP状态码表达结果
返回JSON数据
开发规范
统一响应结果
所有接口返回格式保持一致,方便前端解析
格式
响应码code
响应信息message
数据data