import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 请求Servlet类,处理输入流不能多次读取的问题
*
*/
@Slf4j
public class BodyReaderServletWrapper extends HttpServletRequestWrapper {
private final byte[] body;
/**
* 获取body的内容并解密
*
* @param request 请求对象
* @throws Exception
*/
public BodyReaderServletWrapper(HttpServletRequest request) throws Exception {
super(request);
body = getRequestPostBytes(request);
}
/**
* 获取Reader对象
*
* @return BufferedReader
* @throws IOException
*/
@Override
public BufferedReader getReader() throws IOException {
try {
return new BufferedReader(new InputStreamReader(getInputStream(), "utf-8"));
} catch (NullPointerException e) {
return null;
}
}
/**
* 获取HTTP流
*
* @return ServletInputStream
* @throws IOException
*/
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais;
if(ObjectUtils.isEmpty(body)){
}
bais = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return bais.read();
}
};
}
/***
* 获取 request 中 json 字符串的内容
*
* @param request
* @return : byte[]
* @throws IOException
*/
public static String getRequestJsonString(HttpServletRequest request)
throws IOException {
String submitMehtod = request.getMethod();
// GET
if (submitMehtod.equals("GET")) {
return new String(request.getQueryString().getBytes("iso-8859-1"),"utf-8").replaceAll("%22", "\"");
// POST
} else {
return getRequestPostStr(request);
}
}
/**
* 描述:获取 post 请求的 byte[] 数组
*
* 举例:
*
* @param request
* @return
* @throws IOException
*/
public static byte[] getRequestPostBytes(HttpServletRequest request)
throws IOException {
int contentLength = request.getContentLength();
if(contentLength<0){
return null;
}
byte buffer[] = new byte[contentLength];
for (int i = 0; i < contentLength;) {
int readlen = request.getInputStream().read(buffer, i,
contentLength - i);
if (readlen == -1) {
break;
}
i += readlen;
}
return buffer;
}
/**
* 描述:获取 post 请求内容
*
* 举例:
*
* @param request
* @return
* @throws IOException
*/
public static String getRequestPostStr(HttpServletRequest request)
throws IOException {
byte buffer[] = getRequestPostBytes(request);
String charEncoding = request.getCharacterEncoding();
if (charEncoding == null) {
charEncoding = "UTF-8";
}
return new String(buffer, charEncoding);
}
}