SpringBoot 全局请求拦截

news/2024/7/5 3:00:57

方法一

在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 {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在请求处理之前进行调用(Controller方法调用之前)
        // 返回true才会继续向下执行,返回false取消当前请求
        System.out.println("GlobalInterceptor preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
        System.out.println("GlobalInterceptor postHandle");
    }

    @Override
    public 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 {

    @Autowired
    private GlobalInterceptor globalInterceptor;

    @Override
    public 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 {

    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType,
                            Class<? extends HttpMessageConverter<?>> converterType) {
        // 判断是否支持对该请求进行处理
        return true;
    }

    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                           Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
        // 对请求体进行处理,返回处理后的HttpInputMessage
        return inputMessage;
    }

    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                Class<? extends HttpMessageConverter<?>> converterType) {
        // 请求体读取完成后的处理,可以对body进行进一步处理
        return body;
    }

    @Override
    public 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> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        // 判断是否支持对该响应进行处理
        return true;
    }

    @Override
    public 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://lihuaxi.xjx100.cn/news/1717104.html

相关文章

Java并发线程池原理源码深入分析与调优实战

一&#xff0c;开篇&#xff1a; java中提供了多线程设计的Api&#xff0c;为什么还要用线程池呢&#xff1f; 下来看两个例子&#xff1a; 1. 使用多线程跑十万次 2. 使用线程池跑十万次 使用多线程跑十万次 package com.laoyang.ThreadPool.公开课;import java.util.ArrayL…

2023-10学习笔记

1.sql注入 不管是上一篇博客&#xff0c;通过java代码执行sql 还是我们常用的Mybatis的#{}和${} 都会提到sql注入的问题 1.1啥是sql注入 应该知道是说传入无关的参数&#xff0c;比如本来是想要一个where条件查询参数 但是你拼了一个drop 比如 原来的sql select * from…

统计学习方法 支持向量机(下)

文章目录 统计学习方法 支持向量机&#xff08;下&#xff09;非线性支持向量机与和核函数核技巧正定核常用核函数非线性 SVM 序列最小最优化算法两个变量二次规划的求解方法变量的选择方法SMO 算法 统计学习方法 支持向量机&#xff08;下&#xff09; 学习李航的《统计学习方…

如何将Python程序打包并保护源代码

导言: 在某些情况下,我们可能希望将Python程序打包成可执行文件,以便用户无法查看程序的源代码。这种需求通常出现在商业软件、数据分析工具或其他需要保护知识产权的场景中。本文将介绍如何使用PyInstaller工具来打包Python程序,并确保它可以执行和读取配置信息。 第一步…

纺织辅料经营小程序商城的作用是什么

数字化时代&#xff0c;各个行业都在通过线上转型实现新增长&#xff0c;纺织辅料厂商也一样&#xff0c;需要通过线上化实现与客户的面对面交流有利于打造品牌及构建私有化流量池&#xff0c;但无论入驻哪家电商平台及垂直行业平台&#xff0c;都有不少的佣金及入驻费。 可通过…

【人工智能Ⅰ】实验1:谓词表示法与产生式知识表示

实验1 谓词表示法与产生式知识表示 一、实验目的 1、熟悉谓词逻辑表示法&#xff1b; 2、理解和掌握产生式知识表示方法&#xff0c;实现产生式系统的规则库。 二、实验内容 要求通过C/C/python语言编程实现&#xff1a; 1、猴子摘香蕉问题 2、动物识别系统 &#xff08…

长城首款MPV上市,能否迎来「高山」时刻?

作者 | Amy 编辑 | 德新 去年下半年起&#xff0c;自主品牌接二连三抢占高端MPV市场&#xff0c;腾势D9、岚图梦想家、极氪009以及传祺E9等车型接连亮相。 国泰君安证券研究报告显示&#xff0c;新能源MPV 2021年、2022年年销量分别为4.4万和9.2万辆&#xff0c;今年上半年销…

命令行输入sns.countplot(data[‘marital‘])报错

代码sns.countplot(data[marital])是用于绘制柱状图来显示分类变量的频数分布。但是&#xff0c;根据警告信息&#xff0c;从Seaborn 0.12版本开始&#xff0c;只有一个有效的位置参数data&#xff0c;其他参数必须作为关键字参数传递。因此&#xff0c;你需要将参数data[marit…