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()});
|
}
|
}
|
}
|
|