SpringBoot统一功能处理

(一).拦截器

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格式

已经有了这三个属性了,但是由于定义了"统一数据返回格式",

此时,就又被封装了一层,所以会被套了两层

要解决这个问题,还是要修改这个"统一数据返回格式"的代码

(三).统一异常处理

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

上图是进行了统一异常的处理

下面就具体来介绍一下"统一异常处理"

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

统一异常的原因,一方面是为了返回同样的格式,便于前端解析,另一方方面是为了避免某些安全性的问题

如果想要搞懂内部实现逻辑,还是需要翻看原码,这里就不多介绍了

相关推荐
cpp_learner1 分钟前
Qt 5.14.2 x86_64 静态编译 —— 从零搭建完整手册
后端
ID346107442012 分钟前
【课程设计】基于Spring Boot+Vue的校园共享无人机服务系统设计与实现-计算机毕设 附源码44219
javascript·vue.js·spring boot·python·node.js·php·课程设计
夜不会漫长12 分钟前
C++:类和对象(2)
java·javascript·c++
IT毕设实战小研17 分钟前
基于大数据的国内主要农作物产量趋势分析与可视化
android·java·大数据·django·课程设计
星辞秋19 分钟前
Java 入门实战:从零搭建环境到写出第一个可用的命令行工具
java
ch.ju21 分钟前
Java—idea知识:如何创建新项目
java·开发语言·intellij-idea
土司大王23 分钟前
LeetCode hot100——74.搜索二维矩阵:Java 二分模板
java·算法·leetcode
2302_1111 小时前
java依赖小结
java·运维·数据库
sunshine22 girl1 小时前
Java学习三 高级语法3, 方法
java·学习
captain3761 小时前
网络原理(3)-TCP核心机制连接管理▲▲▲
java·服务器·网络·ide·网络协议·tcp/ip·java-ee