From dd3a17275f1ed2c4853569712a016a1fa7522b98 Mon Sep 17 00:00:00 2001 From: tjq Date: Sat, 16 Mar 2024 11:47:48 +0800 Subject: [PATCH] fix: openapi can't work #854 --- .../config/CachingRequestBodyFilter.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/config/CachingRequestBodyFilter.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/config/CachingRequestBodyFilter.java index e41136fb..5f796cf6 100644 --- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/config/CachingRequestBodyFilter.java +++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/config/CachingRequestBodyFilter.java @@ -1,15 +1,18 @@ package tech.powerjob.server.config; +import com.google.common.collect.Sets; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.*; +import java.util.Set; /** * 解决 HttpServletRequest 只能被读取一次的问题,方便全局日志 & 鉴权,切面提前读取数据 * 在请求进入Servlet容器之前,先经过Filter的过滤器链。在请求进入Controller之前,先经过 HandlerInterceptor 的拦截器链。Filter 一定先于 HandlerInterceptor 执行 + * 解决HttpServletRequest 流数据不可重复读 * * @author tjq * @since 2024/2/11 @@ -17,15 +20,27 @@ import java.io.*; @Component public class CachingRequestBodyFilter implements Filter { + + /** + * 忽略部分不需要处理的类型: + * GET 请求的数据一般是 Query String,直接在 url 的后面,不需要特殊处理 + * multipart/form-data:doDispatch() 阶段就会进行处理,此处已经空值了,强行处理会导致结果空 + * application/x-www-form-urlencoded:估计也类似,有特殊逻辑,导致 OpenAPI 部分请求参数无法传递,同样忽略 + */ + private static final Set IGNORE_CONTENT_TYPES = Sets.newHashSet("application/x-www-form-urlencoded", "multipart/form-data"); + @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (request instanceof HttpServletRequest) { - CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper((HttpServletRequest) request); - chain.doFilter(wrappedRequest, response); - } else { - chain.doFilter(request, response); + String contentType = request.getContentType(); + if (contentType != null && !IGNORE_CONTENT_TYPES.contains(contentType)) { + CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(wrappedRequest, response); + return; + } } + chain.doFilter(request, response); } // Implement other required methods like init() and destroy() if necessary