(一).拦截器
1.概念
拦截器是Spring框架提供的核心功能之一,主要用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的代码

2.详解
(1).拦截路径
拦截路径指的是我们定义的这个拦截器要对哪些请求生效。
|------------|--------------|--------------------------------------------------------|
| 拦截路径 | 含义 | 举例 |
| /* | 一级路径 | 能匹配/user,/book,/login,不能匹配/user/login |
| /** | 任意级路径 | 能匹配/user,/user/login,/user/reg |
| /book/* | /book下的一级目录 | 能匹配/book/addBook,不能匹配/book/addBook/1,/book |
| /book/** | /book下的任意级路径 | 能匹配/book,/book/addBook,/book/addBook/2,不能匹配/user/login |
(2).拦截器执行步骤

当添加了拦截器之后,在执行Controller的方法之前,请求会先被拦截器截住。
3.使用
下面,在我写的一个图书管理系统中来掩饰一下拦截器的使用

上图是我的登录页

这是我的图书列表页。
如果说,现在没有用户登录,那么是看不了图书列表页的,只有当用户登录了,才能看到图书列表页。此时,就可以使用拦截器来解决这个问题
要使用拦截器,分为两个步骤,(1).自定义拦截器 (2).注册配置拦截器
(1).自定义拦截器

(2).注册配置拦截器

此时,再看拦截器的代码

当登录之后,此时拦截器返回true,此时是可以看到他图书列表页的

但是,当未登录的时候

通过前端,强制跳转回登录页

有兴趣的可以看一下Spring的源码,这里就不多介绍了
4.介绍"适配器模式"
(1).概念
适配器模式,也叫包装器模式。他是将一个类的接口,转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间。简单的来说,就是目标类不能直接使用,此时可以通过一个新类进行包装,适配调用方进行使用,把两个不兼容的接口通过一定的方式使之兼容。
这里,介绍适配器模式的原因是因为,在Spring原码中使用了适配器模式。

上图就是适配器的示例
(2).举例
之前,在介绍Spring日志的时候,介绍到过Slf4j,slf4j除了使用了门面模式之外,还使用了适配器模式。

Slf4j不同于其他日志框架,它并不是一个真正的日志实现,它只是对日志框架指定了一种规范。所有Slf4j并不能独立使用,需要和具体的日志框架配合使用
此时,slf4j提供了⼀系列打印⽇志的api, 底层调⽤的是log4j 或者 logback来打⽇志, 我们作为调⽤者, 只需要调⽤slf4j的api就⾏了


(二).统一数据返回格式
1.使用

上图是未使用统一功能进行的测试

上图是使用了统一功能的测试
下面就来具体介绍一下

(2).存在问题
但是,统一返回格式也是有问题的



但是,当测试到返回"String"类型的数据的时候,发现报错了

这是报错的日志
如果真的想要彻底搞懂为什么会报错,那么还是需要去看源码,这里就不多介绍了
解决方法就是在这个"同意返回数据格式"的类上进行修改

此时,还有一个问题

当我登录之后访问图书列表,发现并没有显示出数据

后端也没报错

当看前端控制台的时候,发现报错了。可以发现,这个返回的结果被套了两层

同样,通过postman、进行测试的时候也是被套了两层

此时,就发现问题了
获取图书列表的返回格式是Result格式

已经有了这三个属性了,但是由于定义了"统一数据返回格式",
此时,就又被封装了一层,所以会被套了两层
要解决这个问题,还是要修改这个"统一数据返回格式"的代码

(三).统一异常处理


上图是我手动抛出了一个异常,此时我还没有进行统一异常的处理

上图是进行了统一异常的处理
下面就具体来介绍一下"统一异常处理"

同样我们也可以构造不同的异常



统一异常的原因,一方面是为了返回同样的格式,便于前端解析,另一方方面是为了避免某些安全性的问题
如果想要搞懂内部实现逻辑,还是需要翻看原码,这里就不多介绍了