SpringBoot 统一功能处理

上篇博客我们最后聊到了强制登录那块,这篇博客,目标是,拦截器,统一数据返回,统一异常处理,讲这3个点。

目录

🍁拦截器

🍂定义拦截器

🍂使用拦截器

🍁登录校验

🍂定义拦截器

🍂使用拦截器

🍂postman测试

🍁统一数据返回格式

🍂测试

🍂解决String的特殊问题

🍁统一异常处理

🍂测试


🍁拦截器

🍂定义拦截器

首先,我们要实现HandlerInterceptor接口,重写preHandle,postHandle,afterCompletion方法,这个按你的需求来,这三个按顺序来,作用分别是,执行目标方法开始之前,执行目标方法结束返回之前,最后一个是视图渲染完成之后。

🍂使用拦截器

也是写个类实现WebMvcConfigurer接口,重写addInterceptors方法,然后在重写的这个方法里

复制代码
registry.addInterceptor(loginInterceptor).addPathPatterns("/**");

addInterceptor方法,往里写要使用的拦截器,

addPathPatterns方法,往里写要拦截的路径。


🍁登录校验

🍂定义拦截器

首先实现HandlerInterceptor接口,重写preHandle方法,因为我们这个是自己拦截返回哈,如果拦截成功,就不走spring里写的那个代码了,所以要设置response的相关参数,如下面这个响应。

状态码需要设置吧,content-type也需要设置吧。

所以我们这样设置content-type

java 复制代码
response.setContentType("application/json;charset=utf-8");

然后设置状态码

java 复制代码
response.setStatus(401);

下面这两行是将响应正文写入response里去

复制代码
getOutputStream().write就是拿到那个写的流,
复制代码
objectMapper.writeValueAsBytes(result)就是将result结果写成字节数组,放到流里,我是这么理解的。

最后拦截成功,执行完拦截器的逻辑后,返回false,就不走我们自己的代码了。走的话,返回true。

🍂使用拦截器

写个类实现WebMvcConfigurer接口,然后addInterceptor方法添加拦截器,addPathPatterns方法要拦截的路径,excludePathPatterns要排除的路径。

🍂postman测试

拦截成功,并且也成功返回401了。全都对上了。

🍁统一数据返回格式

我的理解是,在原有的方法返回值外再套一层壳子,这个壳子就是你要写的统一数据返回格式

要实现ResponseBodyAdvice接口,添加@ControllerAdvice注解。

上面那个supports方法返回true就是要执行beforeBodyWrite方法,body就是原返回值。

🍂测试

结果返回正确,原方法本来返回true,现在套了一层壳。

但是发现当方法的返回值为String的时候,

这个统一返回格式就出错了,里面的data按理说应该填我们写的返回值。

测试发现,

说明string返回值的方法,如果用的是统一返回值格式,需要特殊处理一下。

🍂解决String的特殊问题

先得到Result对象,而我们原方法的返回值是String类型的,为避免发生冲突,我们的手动的把Result对象给转化成json一下,这样就不会冲突了。

🍁统一异常处理

统一异常处理,是为了给我们的代码进行兜底,避免把还未处理的异常信息传递给前端。

我们故意写了个指针越界异常,然后我们访问一下这个接口

发现在返回的data直接就是异常信息,说服务错误--也就是代码有报错的。

那么我们咋样解决呢?

也是和统一数据返回格式一样要加@ControllerAdvice注解,然后得加@ResponseBody,告诉spring我们返回的是数据。随后在方法里设置你要返回的返回值类型,返回情况,异常传参,最后得加上@ExceptionHandler注解---捕获异常的注解。

🍂测试

发现,异常捕获了,并且按照我们预期的结果返回给了前端。

完结。

相关推荐
vx-Biye_Design4 小时前
SSM伴侣动物伴护星小程序06330-计算机课程设计、毕业设计
spring boot·后端·elasticsearch·小程序·架构·课程设计·idea
2分钟速写快排6 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
面向Google编程6 小时前
Apache Iceberg Variant 类型:v3 半结构化数据不再「二选一」
大数据·后端
lhldsg6 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都7 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒7 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
辰烨chenye7 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰8 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
小荷才露尖尖角,早有蜻蜓立上头9 小时前
过滤器的4种创建方式
java