package org.jeecg.config.sign.util;
|
|
import javax.servlet.ReadListener;
|
import javax.servlet.ServletInputStream;
|
import javax.servlet.ServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequestWrapper;
|
import java.io.*;
|
import java.nio.charset.Charset;
|
|
/**
|
* 保存过滤器里面的流
|
*
|
* @author jeecg
|
* @date 20210621
|
*/
|
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|
private final byte[] body;
|
|
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) {
|
|
super(request);
|
String sessionStream = getBodyString(request);
|
body = sessionStream.getBytes(Charset.forName("UTF-8"));
|
}
|
|
/**
|
* 获取请求Body
|
*
|
* @param request
|
* @return
|
*/
|
public String getBodyString(final ServletRequest request) {
|
|
StringBuilder sb = new StringBuilder();
|
try (InputStream inputStream = cloneInputStream(request.getInputStream());
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")))) {
|
String line;
|
while ((line = reader.readLine()) != null) {
|
sb.append(line);
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return sb.toString();
|
}
|
|
/**
|
* Description: 复制输入流</br>
|
*
|
* @param inputStream
|
* @return</br>
|
*/
|
public InputStream cloneInputStream(ServletInputStream inputStream) {
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
byte[] buffer = new byte[1024];
|
int len;
|
try {
|
while ((len = inputStream.read(buffer)) > -1) {
|
byteArrayOutputStream.write(buffer, 0, len);
|
}
|
byteArrayOutputStream.flush();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
|
}
|
|
@Override
|
public BufferedReader getReader() {
|
|
return new BufferedReader(new InputStreamReader(getInputStream()));
|
}
|
|
@Override
|
public ServletInputStream getInputStream() {
|
|
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
|
return new ServletInputStream() {
|
|
@Override
|
public int read() {
|
|
return bais.read();
|
}
|
|
@Override
|
public boolean isFinished() {
|
|
return false;
|
}
|
|
@Override
|
public boolean isReady() {
|
|
return false;
|
}
|
|
@Override
|
public void setReadListener(ReadListener readListener) {
|
|
}
|
};
|
}
|
}
|