【Spring Boot 使用Filter统一处理请求数据转换】

Spring Boot 使用Filter统一处理请求数据转换

    • 背景知识
      • Spring Boot Filter 使用场景
    • 请求预处理技术实现
      • 1. 创建自定义Filter类
      • 2. 创建自定义请求包装器
      • 3. 注册Filter

背景知识

Spring Boot Filter 使用场景

  1. 身份验证和授权
    场景描述: 在用户访问应用程序的敏感资源之前,需要验证用户的身份并授权用户访问特定的内容。
    实现方式: 使用Filter拦截请求,检查HTTP请求中的身份验证令牌(如JWT),并确定用户是否具有执行操作的权限。
  2. 日志记录和审计
    场景描述: 记录应用程序的请求和响应数据,用于监控、调试或遵守法规要求的审计。
    实现方式: 实现一个Filter来捕获请求的细节(如请求路径、查询参数、用户代理等)和响应的信息,然后将这些信息记录到日志系统中。
  3. 请求预处理
    场景描述: 在请求到达控制器之前,对请求进行预处理,例如设置请求上下文、执行数据格式转换。
    实现方式: 在Filter中对请求头或请求体进行必要的修改或添加额外的请求信息。
  4. 响应自定义
    场景描述: 对服务器的响应进行自定义处理,如添加额外的HTTP头部信息或对响应数据进行处理。
    实现方式: 在Filter中修改HttpServletResponse对象,添加如CORS头部、缓存控制等。
  5. 异常处理
    场景描述: 集中处理请求处理过程中抛出的异常,而不是在每个控制器中分别处理。
    实现方式: 实现一个Filter来捕获和处理请求处理链中发生的异常,返回一个统一的错误响应结构。
  6. 服务限流与安全
    场景描述: 限制请求的频率或数量,防止恶意攻击或服务过载。
    实现方式: 在Filter中实现限流逻辑,如令牌桶或漏桶算法,拒绝超出限制的请求。
  7. 跨域资源共享(CORS)
    场景描述: 允许或限制不同域之间的资源请求。
    实现方式: 通过Filter设置响应头部来控制CORS策略,例如Access-Control-Allow-Origin。
  8. 性能监控
    场景描述: 监控应用程序的性能,如请求的处理时间。
    实现方式: 在Filter中记录请求的开始和结束时间,计算处理时长,并可能将这些数据发送到性能监控系统。
    Spring Boot中的Filter为开发者提供了一个强大的工具,可以在不改变现有控制器逻辑的情况下,全局地处理HTTP请求和响应。它们通常用于处理跨多个请求和响应的横切关注点。

请求预处理技术实现

1. 创建自定义Filter类

  • 内容: 定义一个实现javax.servlet.Filter接口的类。在这个类中,你将覆写doFilter方法以便在请求到达Controller之前对数据进行预处理。

示例代码

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class CustomRequestFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// Filter初始化时调用,可以用来配置一些资源}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 将ServletRequest转换为HttpServletRequestHttpServletRequest httpRequest = (HttpServletRequest) request;// 创建自定义的请求包装器CustomHttpServletRequestWrapper requestWrapper = new CustomHttpServletRequestWrapper(httpRequest);// 继续过滤器链,传入自定义包装器chain.doFilter(requestWrapper, response);}@Overridepublic void destroy() {// Filter销毁时调用,可以用来释放资源}
}

2. 创建自定义请求包装器

  • 内容: 定义一个继承自javax.servlet.http.HttpServletRequestWrapper的类,用于包装原始的HttpServletRequest,并对请求体中的数据进行转换。

示例代码

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {private final byte[] requestBody;public CustomHttpServletRequestWrapper(HttpServletRequest request) {super(request);// 从原始请求中读取数据,并进行转换处理// 示例中仅读取数据,实际使用时可在此处进行转换requestBody = readBytesFromRequest(request);}@Overridepublic BufferedReader getReader() throws IOException {ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(requestBody);return new BufferedReader(new InputStreamReader(byteArrayInputStream));}// 辅助方法:从HttpServletRequest中读取请求体数据为byte[]private byte[] readBytesFromRequest(HttpServletRequest request) {// 实现从原始请求中读取数据的逻辑// ...return new byte[0];}
}

3. 注册Filter

  • 内容: 在Spring Boot中,你需要注册自定义的Filter,以便框架将其加入到过滤器链中。

示例代码

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<CustomRequestFilter> customFilter() {FilterRegistrationBean<CustomRequestFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new CustomRequestFilter());registrationBean.addUrlPatterns("/api/*"); // 设置Filter的URL模式return registrationBean;}
}

使用这种方式,你可以在CustomHttpServletRequestWrapper中对所有传入的请求数据进行统一的预处理和转换,而不需要在每个Controller方法中单独处理。记得在实现读取和转换逻辑时处理好异常情况,并确保线程安全。

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

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

相关文章

【经验分享】自然语言处理技术有哪些局限性和挑战?

个人认为&#xff0c;主要是两个难点&#xff1a; 1.语料&#xff0c;通常的语料很好解决&#xff0c;用爬虫从互联网上就可以采集和标注训练。但是我们接触很多项目和客户需求都是专业性很强的&#xff0c;例如&#xff1a;航天材料、电气设备、地理信息、化学试剂 等等。往往…

Python面向对象:组合

组合与重用性 组合指的是&#xff0c;在一个类中以另外一个类的对象作为数据属性&#xff0c;称为类的组合 class Equip: # 武器装备类 def fire(self): print(release Fire skill) class Riven: # 英雄Riven的类&#xff0c;一个英雄需要有装备&#xff0c;因而需要组合E…

【微服务生态】Docker

文章目录 一、基础篇1. 简介2. 下载与安装3. 常用命令3.1 帮助启动类3.2 镜像命令3.3 容器命令 4. Docker 容器数据券5. Docker 镜像5.1 commit 生成镜像5.2 Docker Registry5.3 发布镜像 6. Docker 常规安装软件 二、高级篇1. Dockerfile1.1 概述1.2 基础知识1.3 Dockerfile常…

使用单元测试框架Junit的正确姿势

大家好&#xff0c;我是G探险者。 不知道大家平时开发出来的功能&#xff0c;写不写单元测试&#xff1f;反正我是不咋写&#xff0c;写个单元测试有时候mock比开发实际功能都难搞&#xff0c;谁写谁懂得。 没办法&#xff0c;由于甲方爸爸的要求&#xff0c;我们必须得写单元…

如何系统地自学Python?

如何系统地自学Python&#xff1f; 如何系统地自学Python&#xff1f;1.了解编程基础2.学习Python基础语法3.学习Python库和框架4.练习编写代码5.参与开源项目6.加入Python社区7.利用资源学习8.制定学习计划9.持之以恒总结 如何系统地自学Python&#xff1f; 作为一个Python语…

爬虫基本库的使用(urllib库的详细解析)

学习爬虫&#xff0c;其基本的操作便是模拟浏览器向服务器发出请求&#xff0c;那么我们需要从哪个地方做起呢?请求需要我们自己构造吗? 我们需要关心请求这个数据结构怎么实现吗? 需要了解 HTTP、TCP、IP层的网络传输通信吗? 需要知道服务器如何响应以及响应的原理吗? 可…

32单片机基础:GPIO输出

目录 简介&#xff1a; GPIO输出的八种模式 STM32的GPIO工作方式 GPIO支持4种输入模式&#xff1a; GPIO支持4种输出模式&#xff1a; 浮空输入模式 上拉输入模式 下拉输入模式 模拟输入模式&#xff1a; 开漏输出模式&#xff1a;&#xff08;PMOS无效&#xff0c;就…

技术心得--如何成为优秀的架构师

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/技术辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

三防加固平板在房地产行业的应用|亿道三防onerugged

近期&#xff0c;有一款引人注目的解决方案——亿道三防onerugged平板电脑&#xff0c;它以其出色的性能和多功能的设计&#xff0c;为房地产行业带来了全新的应用体验。 首先&#xff0c;亿道三防onerugged平板电脑的NFC功能在小区业主身份验证中发挥着重要作用。传统的身份验…

vue3组件通信方式汇总

前言&#xff1a;本文默认读者有JS基础和Vue基础&#xff0c;如果没有这个两个基础&#xff0c;可能阅读比较困难&#xff0c;建议先看下官方文档&#xff0c;当然&#xff0c;也欢迎评论交流&#x1f601; 通信方式总结 常见搭配形式 一、props&#xff08;使用频率最高&#…

HarmonyOS 鸿蒙应用开发(十二、paho-mqtt的mqtt客户端库移植)

PAHO MQTT 是 Eclipse Foundation 的一个开源项目&#xff0c;提供了用于 MQTT 协议的客户端库。这个库为使用 MQTT 协议的应用程序提供了丰富的功能和灵活性。轻量级mqtt服务器mosquitto也是其中有名的一个开源项目。 目录 PAHO MQTT介绍 移植过程 index.d.ts文件修改 写…

SOPHON算能科技新版SDK环境配置以及C++ demo使用过程

目录 1 SDK大包下载 2 获取SDK中的库文件和头文件 2.1 注意事项 2.2 交叉编译环境搭建 2.2.1 首先安装工具链 2.2.2 解压sophon-img包里的libsophon_soc__aarch64.tar.gz&#xff0c;将lib和include的所有内容拷贝到soc-sdk文件夹 2.2.3 解压sophon-mw包里的sophon-mw-s…

hadoop FileSystem是否要close

先来说结论&#xff0c;最好不要close&#xff0c;让hadoop自己close&#xff0c;否则容易把进程里其他获取fs的地方一起关了。这是因为 FileSystem.get(Configuration)做了缓存的原因。当然可以设置 conf.setBoolean("fs.hdfs.impl.disable.cache", true); 就不缓存…

Django后台管理(一)

一、admin介绍 Django 最强大的部分之一是自动管理界面。它从你的模型中读取元数据,提供一个快速的、以模型为中心的界面,受信任的用户可以管理你网站上的内容 官网:https://docs.djangoproject.com/zh-hans/4.1/ref/contrib/admin/ 提示 后台管理系统是管理人员使用,不是…

Python之海象运算符

在 Python 3.8 及更高版本中&#xff0c;引入了一种新的语法特性&#xff0c;称为"海象运算符"&#xff08;Walrus Operator&#xff09;&#xff0c;它使用 : 符号。这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。 使用海象运算符可以在一些情况下…

centos7下docker的安装

背景 总结下docker的一些知识 docker安装&#xff08;有网络版&#xff09; 参考文章我以前试过这个帖子&#xff0c;建议安装高版本的docker&#xff0c;&#xff08;20以上的&#xff0c;不然可能会有一些问题&#xff09; ## 1、安装依赖 [rootiZo7e61fz42ik0Z ~]#yum i…

laravel-admin的3个开发细节调整

在使用laravel-admin开发的过程中&#xff0c;根据官方开发文档Laravel admin | laravel-admin基本都能实现想要的效果&#xff0c;这里补充3个文档上没有描述的细节 Laravel8命令行创建控制器调整 在laravel-admin中可以使用php artisan admin:make UserController --modelAp…

WireShark 安装指南:详细安装步骤和使用技巧

Wireshark是一个开源的网络协议分析工具&#xff0c;它能够捕获和分析网络数据包&#xff0c;并以用户友好的方式呈现这些数据包的内容。Wireshark 被广泛应用于网络故障排查、安全审计、教育及软件开发等领域。接下将讲解Wireshark的安装与简单使用。 目录 Wireshark安装步骤…

Rasa:停止构建“代理”,并推出真正有效的LLM聊天机器人

Rasa:停止构建“代理”,并推出真正有效的LLM聊天机器人 带语言模型的对话式人工智能 (Conversational AI with Language Models CALM) 是一种用于构建可靠对话式人工智能的大模型方法。它是 Rasa 基于多年来帮助企业团队构建面向客户的助手而开发的。 CALM 的工作原理 CAL…

CSP-201809-1-卖菜

CSP-201809-1-卖菜 解题思路 #include <iostream> using namespace std; int main() {int n;cin >> n;int* array new int[n];for (int i 0; i < n; i){cin >> array[i];}cout << (array[0] array[1]) / 2 << " ";for (int i …