【微服务】网关 - Gateway(下)(day8)

网关过滤工厂

在上一篇文章中,主要是对网关进行了一个总体的介绍,然后对网关中的断言进行了一个描述。在这篇文章中,主要是对网关中的最后一大核心——过滤进行介绍。

当客户端发送过来的请求经过断言之后,如果还想在请求前后添加一些逻辑,那么就可以使用过滤器来做。这个过滤器其实就相当于SpringMVC中的拦截器、Servlet中的过滤器。同样,过滤和断言类似,SpringCloudGateway内部也内置了许多Filter。

过滤器可以分为全局默认过滤器(GlobalFilter)、单一内置过滤器(GatewayFilter)以及自定义过滤器。

过滤器可以在请求前后对业务逻辑进行处理,因此它的功能有:请求鉴权、记录接口耗时等。

GatewayFilter

GatewayFilter,表示单一内置过滤器,一般应用到单个路由或者一个分组的路由上。

和断言相同,在网关服务的配置文件中配置条件,然后在订单服务创建一个FilterController类来测试项目。

跟请求头相关的

AddRequestHeaderGatewayFilterFactory

该过滤器表示在请求头上添加内容,具体内容跟自己配置的文件相关。

如下配置表示在/filter/addRequestHeader请求的请求头上加上key为role,value为admin的内容。

spring:cloud:gateway:routes:- id: 11uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addRequestHeaderfilters:- AddRequestHeader=role, admin
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** AddRequestHeaderGatewayFilterFactory* 表示在请求头中添加一些内容* 测试添加的是role=admin*/@GetMapping("/addRequestHeader")public String addRequestHeader() {ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = servletRequestAttributes.getRequest();String role = request.getHeader("role");return "在过滤内置工厂中添加的内容为:role = " + role;}}

RemoveRequestHeaderGatewayFilterFactory

改过滤器表示将请求头上的内容删除,具体删除内容跟配置文件有关。

如下配置表示移除请求头中key为content的内容。在postman的请求中,专门加入要移除的内容,测试之后发现请求头中确实没有,表示验证成功。

spring:cloud:gateway:routes:- id: 12uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeRequestHeaderfilters:- RemoveRequestHeader=content
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RemoveRequestHeaderGatewayFilterFactory* 表示移除请求头中的一些内容* 测试移除的是content*/@GetMapping("/removeRequestHeader")public String removeRequestHeader(HttpServletRequest request) {String value = "";Enumeration<String> headers = request.getHeaderNames();while (headers.hasMoreElements()) {String headerKey = headers.nextElement();String headValue = request.getHeader(headerKey);value = value +  headerKey + '\t' + headValue + '\n';}return value;}}

SetRequestHeaderGatewayFilterFactory

该过滤器表示修改请求头原先的一些设置,测试发现好像即使没加这个请求头,他也会自动加上。

如下配置表示将请求头中key为usernmae的内容,将其value设置成wbz。

spring:cloud:gateway:routes:- id: 13uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/setRequestHeaderfilters:- SetRequestHeader=username, wbz
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** SetRequestHeaderGatewayFilterFactory* 表示将原先请求头中的内容进行更换* 测试是将key为username的wky更换成wbz*/@GetMapping("/setRequestHeader")public String setRequestHeader(HttpServletRequest request) {return "请求头中username对应的是:" + request.getHeader("username");}}

跟请求参数相关的 

AddRequestParameterGatewayFilterFactory

该过滤器表示在请求参数上添加一些内容。

如下配置表示在请求参数上添加key为phone,value为13191038888的内容。

这里有一个值得注意的地方是,如果在过滤器中声明一个,然后自己写接口时再声明一个,那么使用参数接收到的就是两个内容,使用request.getParameter接收到的就是自己传过来的。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** AddRequestParameterGatewayFilterFactory* 表示在请求参数中加入一些内容* 测试是加入一个key为phone,value为1319103888的键值对*/@GetMapping("/addRequestParameter")public String addRequestParameter(HttpServletRequest request, String phone) {log.info("测试" + phone);return "phone:" + request.getParameter("phone");}}
spring:cloud:gateway:routes:- id: 14uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addRequestParameterfilters:- AddRequestParameter=phone,13191038888

RemoveRequestParameterGatewayFilterFactory

该过滤器表示删除请求参数上的一些内容。

如下配置表示删除请求参数上key为nickName的内容。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RemoveRequestParameterGatewayFilterFactory* 表示在请求参数中删除一些内容* 测试是删除一个key为nickName,无论value是啥的内容*/@GetMapping("removeRequestParameter")public String removeRequestParameter(HttpServletRequest request) {return "nickName:" + request.getParameter("nickName");}}
spring:cloud:gateway:routes:- id: 15uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeRequestParameterfilters:- RemoveRequestParameter=nickName

跟响应头相关的

AddResponseHeaderFilterGatewayFactory

该过滤器表示在响应头上添加一些内容。

如下配置表示在响应头上新增一个key为role,value为admin的键值对。

spring:cloud:gateway:routes:- id: 16uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addResponseHeaderfilters:- AddResponseHeader=role, admin
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** AddResponseHeaderGatewayFilterFactory* 表示在响应头中新增一些内容* 测试是新增一个key为role,content为admin的键值对*/@GetMapping("/addResponseHeader")public String addResponseHeader(HttpServletResponse response) {return "响应";}}

RemoveResponseHeaderFilterGatewayFactory

该过滤器表示移除响应头上的一些内容。

如下配置表示将响应头中key为content的内容移除

spring:cloud:gateway:routes:- id: 17uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeResponseHeaderfilters:- RemoveResponseHeader=content
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RemoveResponseHeaderGatewayFilterFactory* 表示在响应头中移除一些内容* 测试是将key为content的内容移除*/@GetMapping("/removeResponseHeader")public String removeResponseHeader(HttpServletResponse response) {response.setHeader("content", "delete");return "响应";}}

SetResponseHeaderFilterGatewayFactory

该过滤器表示设置响应头上的一些内容,即使原本响应头上没有,依旧可以设置成功,有的话就换成设置之后的。

如下配置表示将key为username的对应的value设置成wbz。

spring:cloud:gateway:routes:- id: 18uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/setResponseHeaderfilters:- SetResponseHeader=username, wbz
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** SetResponseHeaderGatewayFilterFactory* 表示在响应头中设置一些内容* 测试是将key为username的对应value设置为wbz*/@GetMapping("/setResponseHeader")public String setResponseHeader(HttpServletResponse response) {response.setHeader("username", "wky");return "响应";}}

跟路径有关的

PrefixPathGatewayFilterFactory

该过滤器是用来设置统一前缀的,假设某个服务的路径都带有一个相同的前缀,那么就可以使用该过滤器进行设置。当请求通过断言之后,过滤器路由服务之前就会自动加上前缀。

如下配置请求的完整URL是/filter/prefixPath,我将filter抽取出来放到过滤器中,因此我在输入URL时,只输入127.0.0.1:9527/prefixPath,就可以成功路由到/filter/prefixPath上。

spring:cloud:gateway:routes:- id: 19uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/prefixPathfilters:- PrefixPath=/filter
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** PrefixPathGatewayFilterFactory* 表示设置一个响应统一前缀*/@GetMapping("/prefixPath")public String prefixPath() {return "设置统一前缀成功";}}

SetPathGatewayFilterFactory

该过滤器是用来进行地址替换的,客户端发送的地址经过断言之后,就会替换成过滤器中给出的真实地址。

如下配置是客户端发送的请求地址是127.0.0.1:9527/random/test,断言判断为true之后,过滤器就会将这个地址进行替换,然后再向服务端发送请求。

spring:cloud:gateway:routes:- id: 20uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/random/{regexp}filters:- SetPath=/filter/setPath/{regexp}
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** SetPathGatewayFilterFactory* 地址替换,即客户端发送的请求是根据断言来的* 断言成功之后过滤器会将其替换成真实的地址*/@GetMapping("/setPath/{regexp}")public String setPath(@PathVariable String regexp) {return "地址替换成功";}}

 RedirectToGatewayFilterFactory

该过滤器表示重定向。

如下配置表示当客户端访问127.0.0.1:9527/redirectTo时,网关就会重定向到百度。

spring:cloud:gateway:routes: - id: 21uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/redirectTofilters:- RedirectTo=302,https://www.baidu.com

其他

RequestRateLimiterGatewayFilterFactory

该过滤器表示为当前网关的所有请求执行限流过滤,如果被限流,默认会响应HTTP 429-Too ManyRequests。默认提供了RedisRateLimiter的限流算法,采用令牌桶算法实现限流功能(对于具体的限流算法,在介绍Sentinel或其他限流组件时会详细介绍)。

如下配置表示限流过滤器的内容。

spring:cloud:gateway:routes: - id: 22uri:predicates:- Path=/filter/**filters:- RequestRateLimiter=redis-rate-limiter.replenishRate, 10# 令牌填充速度,即每秒钟允许多少个请求(不丢弃任何请求)- RequestRateLimiter=redis-rate-limiter.burstCapacity, 20# 令牌桶容量,即每秒⽤⼾最⼤能够执⾏的请求数量(不丢弃任何请求)。将此值设置为零将阻⽌所有请求。- RequestRateLimiter=redis-rate-limiter.requestedTokens, 1# 每次请求占⽤⼏个令牌,默认为1。

RetryGatewayFilterFactory

该过滤器表示重试过滤器,会针对不同的响应进行重试。当后端服务不可用时,网关会根据配置参数来发起重试。

如下配置中,设置重试3次,然后针对BAD_GATEWAY的响应进行重试。BAD_GATEWAY是HttpStatus中的状态码,只要配置文件中配置的状态和服务响应回去的状态相同,那么就会进行重试。从结果可以看出,共发送了四次请求,正常发送一次,重试三次。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RetryGatewayFilterFactory* 重试过滤器*/@GetMapping("/retry")public String retry(HttpServletResponse response) {log.info("重试机制");response.setStatus(502);return "重试机制";}}
spring:cloud:gateway:routes:  - id: 23uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/retryfilters:- name: Retryargs:retries: 3statuses: BAD_GATEWAY

RequestSizeGatewayFilterFactory

该过滤器表示设置允许接收最大请求包的大小,如果请求大小超过设置的值,则返回413 Payload Too Large。请求包默认大小为5M,单位是字节。

spring:cloud:gateway:routes:  - id: 24uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/requestSizefilters:- name: RequestSizeargs:maxSize: 2048 
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** RequestSizeGatewayFilterFactory* 该过滤器表示能接收的请求包的大小,默认是5MB*/@PostMapping("/requestSize")public String requestSize(@RequestPart MultipartFile file) {return "文件大小为:" + file.getSize();}}

DefaultGatewayFilterFactory

前面写的都是针对某一路由生效的,若需要对全部路由生效,则可以使用该过滤器,这个过滤器就需要一个过滤列表,例如上述的重试过滤器、限流过滤器等等,就可以加入1到默认过滤器中,这样就可以对所有服务生效。

spring:cloud:gateway:default-filters:- name: Retryargs:retries: 3statuses: BAD_GATEWAY- name: RequestSizeargs:maxSize: 2048

 GlobalFilter

GloablFilter表示全局过滤器,他和GatewayFilter的作用是相同的,只不过GlobalFilter会作用到所有的路由请求上。全局过滤器常用于实现与安全性、性能监控和日志记录等相关的全局功能。

全局过滤器Gateway中也内置有许多,例如:

GatewayMetricsFilter:网关指标,提供监控指标。

ForwardRoutingFilter:用于本地forword,请求不转发到下游服务器。

LoadBalancerClientFilter:针对下游服务,实现负载均衡。

具体内容见官网。

自定义过滤器

自定义GatewayFilter

1. 继承AbstarctGatewayFilterFactory抽象类,并实现Orderd接口,而且自定义的类名必须以GatewayFilterFactory结尾。

2. 在自定义类内部新建一个Config类。

3. 重写apply方法,其中写的就是最重要的逻辑。

4. 空参构造方法,内部调用super。

5. 给Orderd赋值,值越小,优先级越高。

@Slf4j
@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> implements Ordered {public MyGatewayFilterFactory() {super(MyGatewayFilterFactory.Config.class);}@Overridepublic GatewayFilter apply(MyGatewayFilterFactory.Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("进入了自定义pre过滤器 + " + config.getName());ServerHttpRequest request = exchange.getRequest().mutate().headers((httpHeaders) -> {httpHeaders.add("name", config.getName());}).build();return chain.filter(exchange).then(Mono.fromRunnable(() -> {ServerHttpResponse response = exchange.getResponse();response.getHeaders().set("role", "admin");log.info("进入了自定义post过滤器");}));}};}@Overridepublic int getOrder() {return 0;}public static class Config{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}

测试:

如下配置中,表示在请求头中加入name:web的内容,在响应头中加入role:admin的内容,经过测试表明,想要加入的内容全部成功,证明自定义过滤器成功。

spring:cloud:gateway:routes:  - id: 25uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/myGatewayFilterfilters:- name: Myargs:name: wbz
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {/*** 自定义的GatewayFilter* 在请求头上新增* 在响应头上新增*/@GetMapping("/myGatewayFilter")public String myGatewayFilter(HttpServletRequest request) {Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {String headerKey = headerNames.nextElement();String headerValue = request.getHeader(headerKey);log.info(headerKey + '\t' + headerValue);}return "成功";}}

自定义GloablFilter

1. 实现GlobalFilter接口和Orderd接口。

2. 重写apply方法。

3. 自定义Orderd值,表示执行顺序。

@Slf4j
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {exchange.getAttributes().put("begin", System.currentTimeMillis());return chain.filter(exchange).then((Mono.fromRunnable(() -> {Long begin = exchange.getAttribute("begin");if(begin != null) {log.info("接口的时间为:" + (System.currentTimeMillis() - begin));}})));}@Overridepublic int getOrder() {return 0;}}

启动项目之后随便找个接口进行测试,但是必须是走网关的接口,只要日志中出现下述内容就表示全局过滤器自定义成功。 

执行顺序

请求路由之后,会把该接口要经过的过滤器整合成一个链式结构,依次执行。每一个过滤器都有一个指定的order值,默认为0,表示该过滤器的优先级。值越小时,优先级越高,执行顺序越靠前。

假设order值相同时,按照默认过滤器 GatewayFilter GlobalFilter的顺序执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/444932.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能制造与精益制造的模型搭建

现行制造模式分析I-痛点改善思路-管控省优四化推行

中间件有哪些分类?

中间件的分类 中间件是位于操作系统和应用程序之间的软件&#xff0c;它提供了一系列服务来简化分布式系统中的应用程序开发和集成。中间件可以根据其功能和用途被分为不同的类别。以下是中间件的一些主要分类&#xff1a; 1. 通信处理&#xff08;消息&#xff09;中间件&am…

利用编程思维做题之反转链表

牛客网题目 1. 理解问题 给到我们的是一个单链表的头节点 pHead&#xff0c;要求反转后&#xff0c;返回新链表的头节点。 首先在心里设想能够快速理解的例子&#xff0c;如给你123序列&#xff0c;要你反转此序列如何回答&#xff1f;将最后一个数字3作为头&#xff0c;然后修…

使用Qt Creator创建项目

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 使用Qt Creator创建项目 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨提示: 1. 新…

基于SpringBoot+Vue的非物质文化遗产保护与传播系统设计实现(地图组件)

&#x1f388;系统亮点&#xff1a;地图组件&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#x…

C/C++进阶(一)--内存管理

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 其它专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 ​​​​​​项目实战C系列_Stark、的博客-CSDN博客 座右铭&a…

RDD优化:缓存和checkpoint机制、数据共享(广播变量、累加器)、RDD的依赖关系、shuffle过程、并行度说明

文章目录 1. 缓存和checkpoint机制1.1 缓存使用1.2 checkpoint1.3 缓存和checkpoint的区别 2. 数据共享2.1 广播变量2.2 累加器 3. RDD依赖关系4.shuffle过程4.1 shuffle介绍4.2 spark计算要尽量避免shuffle 5. 并行度 1. 缓存和checkpoint机制 缓存和checkpoint也叫作rdd的持…

Springboot 整合 Java DL4J 实现企业门禁人脸识别系统

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…

vue后台管理系统从0到1(3)element plus 的三种导入方式

文章目录 vue后台管理系统从0到1&#xff08;3&#xff09;element plus 的三种导入方式element plus 引入方式完整引入按需导入手动导入 vue后台管理系统从0到1&#xff08;3&#xff09;element plus 的三种导入方式 element plus 引入方式 官方网址&#xff1a;https://el…

windows系统更新升级node指定版本【避坑篇!!!亲测有效】(附带各版本node下载链接)一定看到最后!不用删旧版!

Node.js 是一个开源、跨平台的 JavaScript 运行时环境&#xff0c;广泛应用于服务器端和网络应用的开发。随着 Node.js 版本的不断更新&#xff0c;我们可能需要升级到特定版本以满足项目需求或修复安全漏洞。又或者是学习开发另外一个新项目&#xff0c;新项目对Node版本要求更…

优达学城 Generative AI 课程2:Large Language Models (LLMs) Text Generation

建议先了解一下附录知识。 文章目录 1 官方课程内容自述Lesson 1: 大型语言模型&#xff08;LLMs&#xff09;简介Lesson 2: 自然语言处理&#xff08;NLP&#xff09;基础Lesson 3: Transformer 和注意力机制Lesson 4: 检索增强生成&#xff08;RAG&#xff09;Lesson 5: 为大…

查找企业联系电话的几种方法

在商业合作和销售拓展的过程中&#xff0c;找到企业的联系电话是至关重要的一步。无论是精准营销还是客户开发&#xff0c;拥有有效的联系方式可以大大提高成功率。那么&#xff0c;如何快速有效地查找企业联系电话呢&#xff1f;下面介绍几种常见的方法&#xff0c;以及如何借…

如何解决项目跟进中关键节点难以把控的问题?

在项目跟进的过程中&#xff0c;关键节点的把控常常是一个棘手的问题。如果不能有效地管理这些节点&#xff0c;项目可能会偏离轨道&#xff0c;导致延误、成本超支甚至失败。下面我们来分析一下都有哪些关键节点难以把控以及相应的应对策略。 1、需求变更节点 在项目进行中&a…

快速入门Tomcat服务(业务发布基础技能)

文章目录 1 Tomcat简介 2 安装tomcat 2.1 安装jdk 2.2 安装Tomcat 3 Tomcat目录结构 4 Tomcat重要配置文件 1 Tomcat简介 Tomcat是Sun公司官方推荐的Servlet和JSP容器&#xff0c;在中小型系统和并发访问用户不是很多的场合下&#xff0c;其作为轻量级应用服务…

无刷直流电机工作原理:【图文讲解】

电动机 (俗称马达) 是机械能与电能之间转换装置的通称。可以分为电动机和发电机.一般称电机时就是指电动机。这个在日常应用中&#xff0c;比较多见&#xff0c;比如机器人&#xff0c;手机&#xff0c;电动车等。 直流电机&#xff1a;分为有刷直流电机&#xff08;BDC&#…

HTTP的工作原理

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在计算机网络上传输超文本数据的应用层协议。它是构成万维网的基础之一&#xff0c;被广泛用于万维网上的数据通信。&#xff08;超文本(Hypertext)是用超链接的方法&#xff0c;将各种不同空间的文字信息组…

【MySQL】CRUD增删改查操作

文章目录 CRUD简介一、Creat 新增1.单行数据全列插入2.单行数据全指定列插入3.多行数据指定列插入 二、Retrieve 检索1.全列查询 --练习阶段最简单的查询&#xff1a;&#xff08;在生产环境最好不要用&#xff01;&#xff01;&#xff09;2.指定列查询3.结果去重查询4.where条…

柒拾伍- AI内容农场生产文章自动发布至公众号 (一)

一、内容农场 X AI 看过很多的新闻说 AI 产生 内容 污染网络&#xff0c;我也想试一下到底能污染成怎样。 然后为了编写爆款的内容&#xff0c;我选用这个 内容农场 的种子是来源于 微博热搜&#xff0c;让生长出来的垃圾文章更加火爆 涉及内容不能放 二、编写代码 关于代…

常用类(一)----包装类的使用和分析

文章目录 1.包装类2.课堂测试题3.包装类方法4.Integer创建机制5.Integer面试题 1.包装类 概念&#xff1a;基本数据类型对应的类就是包装类&#xff0c;就是为了把基本数据类型转换为包装类&#xff0c;使用这个类里面的方法操作数据----装箱的过程&#xff1b; //装箱&#…

springboot查询全部部门流程

前端发送请求后&#xff0c;会请求DeptController的方法list()。 package com.intelligent_learning_aid_system.controller;import com.intelligent_learning_aid_system.pojo.Dept; import com.intelligent_learning_aid_system.pojo.Result; import com.intelligent_learni…