fix: openapi can't work #854

This commit is contained in:
tjq 2024-03-16 11:47:48 +08:00
parent 89e7ef8b40
commit dd3a17275f

View File

@ -1,15 +1,18 @@
package tech.powerjob.server.config; package tech.powerjob.server.config;
import com.google.common.collect.Sets;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.*; import javax.servlet.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*; import java.io.*;
import java.util.Set;
/** /**
* 解决 HttpServletRequest 只能被读取一次的问题方便全局日志 & 鉴权切面提前读取数据 * 解决 HttpServletRequest 只能被读取一次的问题方便全局日志 & 鉴权切面提前读取数据
* 在请求进入Servlet容器之前先经过Filter的过滤器链在请求进入Controller之前先经过 HandlerInterceptor 的拦截器链Filter 一定先于 HandlerInterceptor 执行 * 在请求进入Servlet容器之前先经过Filter的过滤器链在请求进入Controller之前先经过 HandlerInterceptor 的拦截器链Filter 一定先于 HandlerInterceptor 执行
* <a href="https://juejin.cn/post/6858037733776949262">解决HttpServletRequest 流数据不可重复读</a>
* *
* @author tjq * @author tjq
* @since 2024/2/11 * @since 2024/2/11
@ -17,16 +20,28 @@ import java.io.*;
@Component @Component
public class CachingRequestBodyFilter implements Filter { public class CachingRequestBodyFilter implements Filter {
/**
* 忽略部分不需要处理的类型
* GET 请求的数据一般是 Query String直接在 url 的后面不需要特殊处理
* multipart/form-datadoDispatch() 阶段就会进行处理此处已经空值了强行处理会导致结果空
* application/x-www-form-urlencoded估计也类似有特殊逻辑导致 OpenAPI 部分请求参数无法传递同样忽略
*/
private static final Set<String> IGNORE_CONTENT_TYPES = Sets.newHashSet("application/x-www-form-urlencoded", "multipart/form-data");
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { throws IOException, ServletException {
if (request instanceof HttpServletRequest) { if (request instanceof HttpServletRequest) {
String contentType = request.getContentType();
if (contentType != null && !IGNORE_CONTENT_TYPES.contains(contentType)) {
CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper((HttpServletRequest) request); CustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper((HttpServletRequest) request);
chain.doFilter(wrappedRequest, response); chain.doFilter(wrappedRequest, response);
} else { return;
chain.doFilter(request, response);
} }
} }
chain.doFilter(request, response);
}
// Implement other required methods like init() and destroy() if necessary // Implement other required methods like init() and destroy() if necessary