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;
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 执行
* <a href="https://juejin.cn/post/6858037733776949262">解决HttpServletRequest 流数据不可重复读</a>
*
* @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-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
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