如何在SpringBoot项目中灵活配置自定义拦截接口路径

本文主要是介绍如何在SpringBoot项目中灵活配置自定义拦截接口路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

假如现在需要拦截例如以 /zjdl/huz/performance/board 开头的接口

1. 在 ResponseBodyAdvice 中检查请求路径

你可以在 beforeBodyWrite 方法中通过 ServerHttpRequest 对象获取请求的 URL,然后检查是否匹配特定的路径。这样可以确保只有匹配的请求路径被拦截并处理。

示例如下:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@Component
public class CommonResultResponseBodyAdvice implements ResponseBodyAdvice<Object> {private final ObjectMapper objectMapper = new ObjectMapper();@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {// 仅处理返回类型为 CommonResult 的响应return CommonResult.class.isAssignableFrom(returnType.getParameterType());}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {// 获取请求的 URIString path = request.getURI().getPath();// 判断请求路径是否以 /zjdl/huz/performance/board 开头if (path.startsWith("/zjdl/huz/performance/board")) {if (body instanceof CommonResult) {CommonResult<?> result = (CommonResult<?>) body;// 使用 Jackson 将 data 转换为 JsonNode 处理JsonNode dataNode = objectMapper.valueToTree(result.getData());StringUtil.processJsonNode(dataNode);// 将处理后的 JsonNode 重新设置回 CommonResultresult.setData(objectMapper.convertValue(dataNode, new TypeReference<Object>() {}));}}return body;}
}

2. 在拦截器中控制 ResponseBodyAdvice

另一种方式是结合 HandlerInterceptorResponseBodyAdvice,在拦截器中设置一个标记,指示当前请求是否需要由 ResponseBodyAdvice 处理。

2.1 自定义拦截器
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 CustomInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在请求处理之前执行if (request.getRequestURI().startsWith("/zjdl/huz/performance/board")) {request.setAttribute("intercepted", true);}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 请求处理之后但在视图渲染之前执行}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 请求完成后执行}
}
2.2 修改 ResponseBodyAdvice 判断标记

ResponseBodyAdvice 中,你可以检查请求中是否包含这个标记来决定是否进行处理。

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@Component
public class CommonResultResponseBodyAdvice implements ResponseBodyAdvice<Object> {private final ObjectMapper objectMapper = new ObjectMapper();@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {// 仅处理返回类型为 CommonResult 的响应return CommonResult.class.isAssignableFrom(returnType.getParameterType());}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {// 通过 HttpServletRequest 获取标记HttpServletRequest servletRequest = (HttpServletRequest) request;Boolean intercepted = (Boolean) servletRequest.getAttribute("intercepted");if (Boolean.TRUE.equals(intercepted)) {if (body instanceof CommonResult) {CommonResult<?> result = (CommonResult<?>) body;// 使用 Jackson 将 data 转换为 JsonNode 处理JsonNode dataNode = objectMapper.valueToTree(result.getData());StringUtil.processJsonNode(dataNode);// 将处理后的 JsonNode 重新设置回 CommonResultresult.setData(objectMapper.convertValue(dataNode, new TypeReference<Object>() {}));}}return body;}
}

3. 配置拦截器

最后,将拦截器配置到 Spring Boot 项目中。

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 CustomInterceptor customInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(customInterceptor).addPathPatterns("/zjdl/huz/performance/board/**");}
}

这篇关于如何在SpringBoot项目中灵活配置自定义拦截接口路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091551

相关文章

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件