diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RepeatBodyRequestWrapper.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RepeatBodyRequestWrapper.java index 69b3b37e1..9c6333432 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RepeatBodyRequestWrapper.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RepeatBodyRequestWrapper.java @@ -16,18 +16,19 @@ package com.pig4cloud.pigx.common.core.util; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.util.ObjectUtils; import org.springframework.util.StreamUtils; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.util.HashMap; import java.util.Map; /** @@ -38,66 +39,80 @@ import java.util.Map; @Slf4j public class RepeatBodyRequestWrapper extends HttpServletRequestWrapper { - private final byte[] bodyByteArray; + private final byte[] bodyByteArray; + private final Map parameterMap; - private final Map parameterMap; + public RepeatBodyRequestWrapper(HttpServletRequest request) { + super(request); + this.bodyByteArray = getByteBody(request); + // 使用 HashMap 以便后续可以修改 + this.parameterMap = new HashMap<>(request.getParameterMap()); + } - public RepeatBodyRequestWrapper(HttpServletRequest request) { - super(request); - this.bodyByteArray = getByteBody(request); - this.parameterMap = super.getParameterMap(); - } + @Override + public BufferedReader getReader() { + return ObjectUtils.isEmpty(this.bodyByteArray) ? null + : new BufferedReader(new InputStreamReader(getInputStream())); + } - @Override - public BufferedReader getReader() { - return ObjectUtils.isEmpty(this.bodyByteArray) ? null - : new BufferedReader(new InputStreamReader(getInputStream())); - } + @Override + public ServletInputStream getInputStream() { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.bodyByteArray); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return byteArrayInputStream.available() == 0; + } - @Override - public ServletInputStream getInputStream() { - final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.bodyByteArray); - return new ServletInputStream() { - @Override - public boolean isFinished() { - return false; - } + @Override + public boolean isReady() { + return true; // 可以读取 + } - @Override - public boolean isReady() { - return false; - } + @Override + public void setReadListener(ReadListener readListener) { + // doNothing + } - @Override - public void setReadListener(ReadListener readListener) { - // doNoting - } + @Override + public int read() { + return byteArrayInputStream.read(); + } + }; + } - @Override - public int read() { - return byteArrayInputStream.read(); - } - }; - } + private static byte[] getByteBody(HttpServletRequest request) { + byte[] body = new byte[0]; + try { + body = StreamUtils.copyToByteArray(request.getInputStream()); + } catch (IOException e) { + log.error("解析流中数据异常", e); + } + return body; + } - private static byte[] getByteBody(HttpServletRequest request) { - byte[] body = new byte[0]; - try { - body = StreamUtils.copyToByteArray(request.getInputStream()); - } - catch (IOException e) { - log.error("解析流中数据异常", e); - } - return body; - } + @Override + public Map getParameterMap() { + return this.parameterMap; // 返回可变的 parameterMap + } - /** - * 重写 getParameterMap() 方法 解决 undertow 中流被读取后,会进行标记,从而导致无法正确获取 body 中的表单数据的问题 - * @return Map parameterMap - */ - @Override - public Map getParameterMap() { - return this.parameterMap; - } + /** + * 设置新的参数映射 + * @param parameterMap 新的参数映射 + */ + public void setParameterMap(Map parameterMap) { + this.parameterMap.clear(); + this.parameterMap.putAll(parameterMap); + } + @Override + public String getParameter(String name) { + String[] values = parameterMap.get(name); + return (values != null && values.length > 0) ? values[0] : null; + } + + @Override + public String[] getParameterValues(String name) { + return parameterMap.get(name); + } } diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java index e9cc8bbab..3dc6d680e 100755 --- a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java @@ -40,6 +40,7 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; +import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -66,7 +67,9 @@ public class SysLogUtils { // get 参数脱敏 PigxLogProperties logProperties = SpringUtil.getBean(PigxLogProperties.class); - Map paramsMap = MapUtil.removeAny(request.getParameterMap(), + + // 修复request.getParameterMap()其他容器不允许改,tomcat会报错,当然undertow默认可以的 + Map paramsMap = MapUtil.removeAny(new HashMap<>(request.getParameterMap()), ArrayUtil.toArray(logProperties.getExcludeFields(), String.class)); sysLog.setParams(HttpUtil.toParams(paramsMap)); return sysLog;