SpringBoot 全局请求拦截

方法一

在Spring Boot中,可以使用拦截器(Interceptor)来实现全局请求拦截。示例:

首先,创建一个拦截器类,实现HandlerInterceptor接口:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component
public class GlobalInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 在请求处理之前进行调用(Controller方法调用之前)// 返回true才会继续向下执行,返回false取消当前请求System.out.println("GlobalInterceptor preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)System.out.println("GlobalInterceptor postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// 整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要是用于进行资源清理工作)System.out.println("GlobalInterceptor afterCompletion");}}

然后,在配置类中注册拦截器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate GlobalInterceptor globalInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册拦截器,并设置拦截路径registry.addInterceptor(globalInterceptor).addPathPatterns("/**");}}

在上述示例中,GlobalInterceptor类实现了HandlerInterceptor接口,并重写了preHandle、postHandle和afterCompletion方法。在preHandle方法中,可以进行一些前置处理,如权限验证、日志记录等。在postHandle方法中,可以进行一些后置处理,如修改返回结果、添加额外的响应头等。在afterCompletion方法中,可以进行一些资源清理工作。

在WebConfig配置类中,通过addInterceptors方法将GlobalInterceptor注册为拦截器,并设置拦截路径为"/**",表示拦截所有请求。

这样,当有请求进入时,会先经过GlobalInterceptor的preHandle方法,然后进入Controller处理请求,最后再经过GlobalInterceptor的postHandle和afterCompletion方法。

方法二

RequestBodyAdviceResponseBodyAdvice是Spring框架提供的两个接口,用于在请求处理过程中对请求体和响应体进行处理。

RequestBodyAdvice用于在请求到达Controller之前对请求体进行处理,可以对请求体进行修改、解析、验证等操作。

ResponseBodyAdvice用于在Controller方法返回结果之后对响应体进行处理,可以对响应体进行修改、封装、加密等操作。

这两个接口可以同时使用,分别对请求体和响应体进行处理。可以通过实现RequestBodyAdviceResponseBodyAdvice接口,并注册为Spring的Bean来使用。

例如,可以创建一个实现RequestBodyAdvice接口的类来处理请求体:

import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;import java.io.IOException;
import java.lang.reflect.Type;@ControllerAdvice
public class GlobalRequestBodyAdvice implements RequestBodyAdvice {@Overridepublic boolean supports(MethodParameter methodParameter, Type targetType,Class<? extends HttpMessageConverter<?>> converterType) {// 判断是否支持对该请求进行处理return true;}@Overridepublic HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,Class<? extends HttpMessageConverter<?>> converterType) throws IOException {// 对请求体进行处理,返回处理后的HttpInputMessagereturn inputMessage;}@Overridepublic Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,Class<? extends HttpMessageConverter<?>> converterType) {// 请求体读取完成后的处理,可以对body进行进一步处理return body;}@Overridepublic Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {// 处理空请求体的情况return body;}
}

同时,可以创建一个实现ResponseBodyAdvice接口的类来处理响应体:

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@ControllerAdvice
public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {// 判断是否支持对该响应进行处理return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {// 对响应体进行处理,返回处理后的响应体return body;}
}

在上述示例中,GlobalRequestBodyAdvice实现了RequestBodyAdvice接口,用于对请求体进行处理。GlobalResponseBodyAdvice实现了ResponseBodyAdvice接口,用于对响应体进行处理。

通过@ControllerAdvice注解,将这两个类注册为全局的控制器增强,使其生效。

这样,当有请求进入时,会先经过GlobalRequestBodyAdvice对请求体进行处理,然后进入Controller处理请求,最后再经过GlobalResponseBodyAdvice对响应体进行处理。

注意:只有请求参数为@RequestBody,才会执行GlobalRequestBodyAdvice

关系和区别

拦截器(Interceptor)、RequestBodyAdvice和ResponseBodyAdvice可以同时使用。

它们之间的关系和区别如下:

  1. 拦截器(Interceptor):

    • 拦截器是Spring MVC框架提供的一种机制,用于在请求处理的不同阶段进行拦截和处理。
    • 拦截器可以在请求处理之前(preHandle)、请求处理之后(postHandle)以及整个请求处理完成之后(afterCompletion)执行一些额外的逻辑。
    • 拦截器可以用于实现全局的请求拦截、权限验证、日志记录等功能。
  2. RequestBodyAdvice:

    • RequestBodyAdvice是Spring框架提供的一个接口,用于在请求处理过程中对请求体进行处理。
    • RequestBodyAdvice可以在请求到达Controller之前对请求体进行修改、解析、验证等操作。
    • RequestBodyAdvice可以用于实现对请求体的加密解密、数据格式转换、数据校验等功能。
  3. ResponseBodyAdvice:

    • ResponseBodyAdvice是Spring框架提供的一个接口,用于在Controller方法返回结果之后对响应体进行处理。
    • ResponseBodyAdvice可以对响应体进行修改、封装、加密等操作。
    • ResponseBodyAdvice可以用于实现对响应体的加密、数据格式转换、数据封装等功能。

这三个功能可以同时使用,各自负责不同的处理逻辑:

  • 拦截器可以对请求进行全局拦截和处理,可以用于实现全局的请求拦截、权限验证、日志记录等功能。
  • RequestBodyAdvice用于在请求到达Controller之前对请求体进行处理,可以对请求体进行修改、解析、验证等操作。
  • ResponseBodyAdvice用于在Controller方法返回结果之后对响应体进行处理,可以对响应体进行修改、封装、加密等操作。

通过同时使用拦截器、RequestBodyAdvice和ResponseBodyAdvice,可以实现更加灵活和全面的请求和响应处理。

拦截器和RequestBodyAdvice在功能和使用场景上有所不同,可以根据具体需求选择使用。

请求参数类型为@RequestBody,执行顺序如下:

GlobalInterceptor preHandle
GlobalRequestBody supports
GlobalRequestBody beforeBodyRead
GlobalRequestBody supports
GlobalRequestBody afterBodyRead
GlobalResponseBody supports
GlobalResponseBody beforeBodyWrite
GlobalInterceptor postHandle
GlobalInterceptor afterCompletion

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

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

相关文章

如何理解Go言中的Context?

目前看过除了《go语言程序设计》以外最好的教程&#xff1a;https://www.practical-go-lessons.com 原文&#xff1a;https://www.practical-go-lessons.com/chap-37-context 你将在本章中学到什么&#xff1f; 1.什么是上下文&#xff1f; 2.什么是链表&#xff1f; 3.如何…

Leetcode之多线程编程题

1116. 打印零与奇偶数 现有函数 printNumber 可以用一个整数参数调用&#xff0c;并输出该整数到控制台。 例如&#xff0c;调用 printNumber(7) 将会输出 7 到控制台。 给你类 ZeroEvenOdd 的一个实例&#xff0c;该类中有三个函数&#xff1a;zero、even 和 odd 。ZeroEve…

物联网知识复习

物联网的内涵和体系结构 物联网的基本内涵 物联网的基本内涵在于物联&#xff0c;物物相连或者物和人相连的互联网。 也就是说&#xff0c;它是要由物主动发起的&#xff0c;物物互联的互联网。 它的第一层意思是说物和物相连&#xff1b;第二层意思是说物和人相连。 物联网的…

美摄人像背景抠图SDK

企业对于图像处理的需求越来越高。无论是社交媒体营销、产品展示还是企业内部培训&#xff0c;高质量的图像都是吸引用户和提升品牌形象的关键。然而&#xff0c;传统的图像处理工具往往需要大量的手动操作和专业技巧&#xff0c;耗时耗力。为了满足企业对于高效、精准的图像处…

古诗数据,json版本

古诗数据 项目地址 分享一个古诗数据&#xff0c;包含作者、朝代、古诗名称及古诗内容。 分为两个版本&#xff0c;第一个是纯净的故事内容&#xff0c;数据如下&#xff1a; [{"title":"下终南山过斛斯山人宿置酒","auth":"李白"…

✔ ★【备战实习(面经+项目+算法)】 10.22学习时间表(总计学习时间:4.5h)(算法刷题:7道)

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

医院数字档案系统-医院数字档案室建设方案

医院数字档案系统是一种将医院病历、检查报告、检验结果等医学相关数据以数字化形式储存、管理和检索的信息系统。它是利用计算机技术和网络技术对病历、影像、检验、处方等各类医疗信息进行数字化管理&#xff0c;实现电子病历、电子影像、电子处方等数据化服务。 医院数字档案…

Zabbix“专家坐诊”第208期问答汇总

问题一 Q&#xff1a;请问大佬们&#xff0c;我的测试机部署了2个版本的zabbix服务端&#xff0c;在启动第二个的时候报这个错&#xff0c;请问这个路径能在配置文件修改吗&#xff1f; SYJKLiLB64dded94d3c0c.png A&#xff1a;报错是你的进程存在&#xff0c;无法启动。一个…

无缝的链间互操作性:通用消息传递的强大之处

前言 通用消息传递&#xff08;General Message Passing&#xff0c;GMP&#xff09;是一种支持区块链之间通信和数据传输的机制。GMP正在成为增强不同区块链网络之间互操作性的解决方案。GMP允许应用程序构建者通过使用安全消息在区块链之间通信和交换信息来利用任何区块链的…

openEuler 22.03 LTS 安装 Docker CE 和 Dcoker Compose

openEuler 使用 DNF 安装 Docker CE 1024&#xff0c;节日快乐&#xff01;回归正题&#xff0c;DNF 安装 DockerOS 系统环境准备安装 docker-ce 步骤1、更新系统2、安装必要的软件包3、添加 Docker CE 存储库4、更新索引缓存并安装 Docker CE5、启动 Docker 服务6、查看 Docke…

数字驱动,营销赋能丨工商职院电子商务专业学生,前往餐饮美食电商新业态基地试岗交流

纸上得来终觉浅&#xff0c;绝知此事要躬行。为了让学生更好的了解自己与所应聘岗位的匹配度&#xff0c;同时也希望在实际业务场景中&#xff0c;发掘自身优势&#xff0c;10月23日&#xff0c;四川产教融创园信息技术有限公司组织四川工商职业技术学院的电子商务专业学生一行…

微软成AI热潮大赢家,继续押注大模型和人工智能

KlipC报道&#xff1a;微软在官网发布了财报&#xff0c;据数据显示该公司营收同比增长13%达565亿美元&#xff0c;营业利润同比增长25%达269亿美元&#xff0c;净利润同比增长27%达223亿美元。 KlipC的合伙人Andi D表示&#xff1a;“微软的智能云部门收入同比增长19%&#xf…

新成果展示:AlGaN/GaN基紫外光电晶体管的设计与制备

紫外光电探测器被广泛应用于导弹预警、火灾探测、非可见光通信、环境监测等民事和军事领域&#xff0c;这些应用场景的实现需要器件具有高信噪比和高灵敏度。因此&#xff0c;光电探测器需要具备响应度高、响应速度快和暗电流低的特性。近期&#xff0c;天津赛米卡尔科技有限公…

NOIP2023模拟2联测23-害怕

澪有个 n n n 个点 m m m 条边的无向图&#xff0c;每条边都有蓝白两种颜色中的一种&#xff0c;保证蓝色的边形成了这个图的一个生成树。 她希望给这些边赋上边权&#xff0c;保证边权是 1 ∼ m 1 \sim m 1∼m 的排列&#xff0c;使得蓝色的边是最小生成树。 希望这些边权…

JAVA电商平台免费搭建 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

《红蓝攻防对抗实战》三.内网探测协议出网之HTTP/HTTPS协议探测出网

目录 一. 在 Windows 操作系统中探测 HTTP/HTTPS 出网 1. Bitsadmin 命令 2.Certuil 命令 2.Linux系统探测HTTP/HTTPS出网 1.Curl命令 2.Wget命令 对目标服务器探测 HTTP/HTTPS 是否出网时&#xff0c;要根据目标系统类型执行命令&#xff0c;不同类型的操作系统使用的探…

接口调优:从2s到200ms的心路历程分享

hello&#xff0c;大家好&#xff0c;我是灰小猿&#xff01; 平常在开发过程中&#xff0c;时常会遇到一些复杂查询或复杂业务&#xff0c;导致接口出现性能问题&#xff0c;基本上每一个程序猿在工作中都离不开对接口性能的调优&#xff0c; 今天我就在这里记录一下最近在实…

angular2+ 集成系统利用服务作为模块通信中间件

模块间通信的话angular2可以使用Input() 和 Output()进行父子组件间通信 例如 父组件html <app-input-output [item]"currentItem" (deleteRequest)"crossOffItem($event)"> </app-input-output>子组件ts export class ItemDetailComponent…

【IDEA查看一个jar包的依赖】

首先install,打jar包 重新创建一个项目 选中刚才的jar包 在这个包下就能看到jar包的依赖了

ES SearchAPI----Query DSL语言

文章目录 Getting Startedmatch_all查询全部sort排序from\size分页_source指定字段 match匹配查询match_phrase短语匹配multi_match多字段匹配range范围查询bool复合查询must必须匹配&#xff0c;可贡献得分must_not必须不匹配&#xff0c;可贡献得分should可有可无&#xff0c…