提交 b9b46b84 作者: 方治民

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

feat: 新增 CacheRequestContentFilter 来解决 request inputStream 无法重复读取的问题,并优化 RequestAspect 参数打印支持 json 传参
上级 726458db
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
package com.yiring.app.service.upload; package com.yiring.app.service.upload;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import com.yiring.common.config.EnvConfig;
import com.yiring.common.core.Minio; import com.yiring.common.core.Minio;
import com.yiring.common.service.UploadProcessService; import com.yiring.common.service.UploadProcessService;
import com.yiring.common.util.Commons; import com.yiring.common.util.Commons;
...@@ -51,7 +50,6 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -51,7 +50,6 @@ import org.springframework.web.multipart.MultipartFile;
public class UploadProcessServiceImpl implements UploadProcessService { public class UploadProcessServiceImpl implements UploadProcessService {
final Minio minio; final Minio minio;
final EnvConfig env;
@SneakyThrows @SneakyThrows
@Override @Override
......
/* (C) 2021 YiRing, Inc. */ /* (C) 2021 YiRing, Inc. */
package com.yiring.common.aspect; package com.yiring.common.aspect;
import cn.hutool.core.io.IoUtil;
import cn.hutool.extra.servlet.JakartaServletUtil; import cn.hutool.extra.servlet.JakartaServletUtil;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.JSONWriter;
...@@ -9,6 +10,7 @@ import com.yiring.common.core.Result; ...@@ -9,6 +10,7 @@ import com.yiring.common.core.Result;
import com.yiring.common.util.IpUtil; import com.yiring.common.util.IpUtil;
import com.yiring.common.utils.Contexts; import com.yiring.common.utils.Contexts;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.nio.charset.Charset;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -47,6 +49,8 @@ public class RequestAspect { ...@@ -47,6 +49,8 @@ public class RequestAspect {
@Around("apiPointCut()") @Around("apiPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable { public Object around(ProceedingJoinPoint point) throws Throwable {
HttpServletRequest request = Contexts.getRequest(); HttpServletRequest request = Contexts.getRequest();
String contentType = request.getHeader("Content-Type");
// 放行白名单 // 放行白名单
for (String path : IGNORE_LIST) { for (String path : IGNORE_LIST) {
if (request.getServletPath().startsWith(path)) { if (request.getServletPath().startsWith(path)) {
...@@ -70,12 +74,20 @@ public class RequestAspect { ...@@ -70,12 +74,20 @@ public class RequestAspect {
JakartaServletUtil.getHeaderMap(request), JakartaServletUtil.getHeaderMap(request),
JSONWriter.Feature.PrettyFormat JSONWriter.Feature.PrettyFormat
); );
extra += String.format("\nHeaders: %s", headers);
String params = JSONObject.toJSONString( String params = JSONObject.toJSONString(
JakartaServletUtil.getParamMap(request), JakartaServletUtil.getParamMap(request),
JSONWriter.Feature.PrettyFormat JSONWriter.Feature.PrettyFormat
); );
extra += String.format("\nHeaders: %s", headers);
extra += String.format("\nParams: %s", params); 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) { if (result instanceof Result) {
extra += extra +=
String.format( 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论