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