提交 b9b46b84 作者: 方治民

feat: 新增 CacheRequestContentFilter 来解决 request inputStream 无法重复读取的问题,并优化…

feat: 新增 CacheRequestContentFilter 来解决 request inputStream 无法重复读取的问题,并优化 RequestAspect 参数打印支持 json 传参
上级 726458db
......@@ -2,7 +2,6 @@
package com.yiring.app.service.upload;
import cn.hutool.core.io.FileUtil;
import com.yiring.common.config.EnvConfig;
import com.yiring.common.core.Minio;
import com.yiring.common.service.UploadProcessService;
import com.yiring.common.util.Commons;
......@@ -51,7 +50,6 @@ import org.springframework.web.multipart.MultipartFile;
public class UploadProcessServiceImpl implements UploadProcessService {
final Minio minio;
final EnvConfig env;
@SneakyThrows
@Override
......
/* (C) 2021 YiRing, Inc. */
package com.yiring.common.aspect;
import cn.hutool.core.io.IoUtil;
import cn.hutool.extra.servlet.JakartaServletUtil;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
......@@ -9,6 +10,7 @@ import com.yiring.common.core.Result;
import com.yiring.common.util.IpUtil;
import com.yiring.common.utils.Contexts;
import jakarta.servlet.http.HttpServletRequest;
import java.nio.charset.Charset;
import java.time.LocalDateTime;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
......@@ -47,6 +49,8 @@ public class RequestAspect {
@Around("apiPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
HttpServletRequest request = Contexts.getRequest();
String contentType = request.getHeader("Content-Type");
// 放行白名单
for (String path : IGNORE_LIST) {
if (request.getServletPath().startsWith(path)) {
......@@ -70,12 +74,20 @@ public class RequestAspect {
JakartaServletUtil.getHeaderMap(request),
JSONWriter.Feature.PrettyFormat
);
extra += String.format("\nHeaders: %s", headers);
String params = JSONObject.toJSONString(
JakartaServletUtil.getParamMap(request),
JSONWriter.Feature.PrettyFormat
);
extra += String.format("\nHeaders: %s", headers);
extra += String.format("\nParams: %s", params);
if (contentType.contains("application/json")) {
String body = IoUtil.read(request.getInputStream(), Charset.forName(request.getCharacterEncoding()));
String string = JSONObject.toJSONString(JSONObject.parseObject(body), JSONWriter.Feature.PrettyFormat);
extra += String.format("\nBody: %s", string);
}
if (result instanceof Result) {
extra +=
String.format(
......
/* (C) 2024 YiRing, Inc. */
package com.yiring.common.config;
import com.yiring.common.filter.CacheRequestContentFilter;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
/**
* @author Jim
*/
@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
public class FilterConfig {
@Bean
public CacheRequestContentFilter cacheRequestContentFilter() {
return new CacheRequestContentFilter();
}
}
/* (C) 2024 YiRing, Inc. */
package com.yiring.common.filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
/**
* @author Jim
*/
public class CacheRequestContentFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(
@NotNull HttpServletRequest request,
@NotNull HttpServletResponse response,
FilterChain chain
) throws ServletException, IOException {
chain.doFilter(new ContentCachingRequestWrapper(request), response);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论