You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.3 KiB
128 lines
3.3 KiB
3 years ago
|
package com.fr.plugin;
|
||
|
|
||
|
|
||
|
import com.fr.log.FineLoggerFactory;
|
||
|
import com.fr.log.FineLoggerProvider;
|
||
|
|
||
|
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;
|
||
|
import java.nio.charset.StandardCharsets;
|
||
|
|
||
|
/**
|
||
|
* @author 01
|
||
|
* @program wrapper-demo
|
||
|
* @description 包装HttpServletRequest,目的是让其输入流可重复读
|
||
|
* @create 2018-12-24 20:48
|
||
|
* @since 1.0
|
||
|
**/
|
||
|
public class RequestWrapper extends HttpServletRequestWrapper {
|
||
|
FineLoggerProvider log = FineLoggerFactory.getLogger();
|
||
|
/**
|
||
|
* 存储body数据的容器
|
||
|
*/
|
||
|
private byte[] body;
|
||
|
|
||
|
public RequestWrapper(HttpServletRequest request) {
|
||
|
super(request);
|
||
|
// 将body数据存储起来
|
||
|
String bodyStr = getBodyString(request);
|
||
|
body = bodyStr.getBytes(Charset.defaultCharset());
|
||
|
}
|
||
|
|
||
|
public void setBody(byte[] body) {
|
||
|
this.body = body;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取请求Body
|
||
|
*
|
||
|
* @param request request
|
||
|
* @return String
|
||
|
*/
|
||
|
private String getBodyString(final ServletRequest request) {
|
||
|
try {
|
||
|
return inputStream2String(request.getInputStream());
|
||
|
} catch (IOException e) {
|
||
|
log.error("", e);
|
||
|
throw new RuntimeException(e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取请求Body
|
||
|
*
|
||
|
* @return String
|
||
|
*/
|
||
|
public String getBodyString() {
|
||
|
return new String(this.body, StandardCharsets.UTF_8);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 将inputStream里的数据读取出来并转换成字符串
|
||
|
*
|
||
|
* @param inputStream inputStream
|
||
|
* @return String
|
||
|
*/
|
||
|
private String inputStream2String(InputStream inputStream) {
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
BufferedReader reader = null;
|
||
|
|
||
|
try {
|
||
|
reader = new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset()));
|
||
|
String line;
|
||
|
while ((line = reader.readLine()) != null) {
|
||
|
sb.append(line);
|
||
|
}
|
||
|
} catch (IOException e) {
|
||
|
log.error("", e);
|
||
|
throw new RuntimeException(e);
|
||
|
} finally {
|
||
|
if (reader != null) {
|
||
|
try {
|
||
|
reader.close();
|
||
|
} catch (IOException e) {
|
||
|
log.error("", e);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return sb.toString();
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public BufferedReader getReader() throws IOException {
|
||
|
return new BufferedReader(new InputStreamReader(getInputStream()));
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public ServletInputStream getInputStream() throws IOException {
|
||
|
|
||
|
final ByteArrayInputStream inputStream = new ByteArrayInputStream(body);
|
||
|
|
||
|
return new ServletInputStream() {
|
||
|
@Override
|
||
|
public int read() throws IOException {
|
||
|
return inputStream.read();
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean isFinished() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean isReady() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void setReadListener(ReadListener readListener) {
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
}
|