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

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

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

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

(三).统一异常处理

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

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

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

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

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

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

相关推荐
SeaDhdhdhdhdh20 小时前
MCP Server 搭建与使用指南
java·ai·agent·mcp
YH552698420 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
AI_小站21 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
普通网友21 小时前
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
spring boot·elasticsearch·jenkins
笃行35021 小时前
向量数据库单独建一套,这笔账划不划算
后端
许彰午21 小时前
03-三种开发模式
java·架构
涟漪海洋1 天前
创建最新的JDK25镜像,非root环境启动
java
weixin_431600441 天前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
Rain的Java大神之路1 天前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
孙克旭_1 天前
Docker 镜像构建|Vue+SpringBoot+Go 多语言项目 Dockerfile 案例
linux·运维·vue.js·spring boot·docker·dockerfile