package com.zy.asrs.wms.common.security; import com.alibaba.fastjson.JSON; import com.zy.asrs.wms.utils.EncryptUtils; import com.zy.asrs.wms.utils.WebkitParseUtils; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.*; import java.util.HashMap; import java.util.Map; public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper { private final byte[] cachedBody; private final Map parameterMap; public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException { super(request); String requestMethod = request.getMethod(); if ("GET".equalsIgnoreCase(requestMethod)) { Map map = request.getParameterMap(); String jsonString = JSON.toJSONString(map); this.cachedBody = jsonString.getBytes(); this.parameterMap = map; }else { // 读取请求体并缓存 InputStream inputStream = request.getInputStream(); // 方法来读取所有字节 this.cachedBody = readBytesFromInputStream(inputStream); this.parameterMap = new HashMap<>(); // 读取并解析表单数据 parseRequestParameters(); } } private byte[] readBytesFromInputStream(InputStream inputStream) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, bytesRead); } return byteArrayOutputStream.toByteArray(); } @Override public ServletInputStream getInputStream() { return new CachedBodyServletInputStream(cachedBody); } @Override public BufferedReader getReader() { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public String getParameter(String name) { String[] values = parameterMap.get(name); return (values != null && values.length > 0) ? values[0] : null; } @Override public Map getParameterMap() { return parameterMap; } @Override public String[] getParameterValues(String name) { return parameterMap.get(name); } private static class CachedBodyServletInputStream extends ServletInputStream { private final ByteArrayInputStream inputStream; public CachedBodyServletInputStream(byte[] cachedBody) { this.inputStream = new ByteArrayInputStream(cachedBody); } @Override public boolean isFinished() { return inputStream.available() == 0; } @Override public boolean isReady() { return true; } @Override public void setReadListener(ReadListener listener) { throw new UnsupportedOperationException(); } @Override public int read() { return inputStream.read(); } } private void parseRequestParameters() { String string = new String(cachedBody); HashMap formData = WebkitParseUtils.getFormData(string); for (Map.Entry entry : formData.entrySet()) { parameterMap.put(entry.getKey(), new String[]{entry.getValue().toString()}); } } }