| 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<String, String[]> parameterMap;  | 
|   | 
|     public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {  | 
|         super(request);  | 
|         String requestMethod = request.getMethod();  | 
|         if ("GET".equalsIgnoreCase(requestMethod)) {  | 
|             Map<String, String[]> 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<String, String[]> 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<String, Object> formData = WebkitParseUtils.getFormData(string);  | 
|         for (Map.Entry<String, Object> entry : formData.entrySet()) {  | 
|             parameterMap.put(entry.getKey(), new String[]{entry.getValue().toString()});  | 
|         }  | 
|     }  | 
| }  | 
|   |