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