HttpHelper 获取 request body
public class HttpHelper {
private static final Logger LOGGER
= LoggerFactory
.getLogger(HttpHelper
.class);
public static String
getBodyString(ServletRequest request
) {
StringBuilder sb
= new StringBuilder();
try (InputStream inputStream
= request
.getInputStream();
BufferedReader reader
= new BufferedReader(new InputStreamReader(inputStream
, "UTF-8"))) {
String line
= "";
while ((line
= reader
.readLine()) != null
) {
sb
.append(line
);
}
} catch (IOException e
) {
LOGGER
.error(e
.getMessage(), e
);
}
return sb
.toString();
}
}
BodyReaderHttpServletRequestWrapper 缓存 request body
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final byte[] body
;
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request
) throws IOException
{
super(request
);
body
= HttpHelper
.getBodyString(request
).getBytes("UTF-8");
}
@Override
public BufferedReader
getReader() throws IOException
{
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream
getInputStream() throws IOException
{
final ByteArrayInputStream bais
= new ByteArrayInputStream(body
);
return new ServletInputStream() {
@Override
public int read() throws IOException
{
return bais
.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener
) {
}
};
}
}
Filter 中替换后续的 Request 实例
@Order(1)
@WebFilter(filterName
= "paramFilter", urlPatterns
= "/*")
public class RequestWrapperFilter implements Filter {
@Override
public void init(FilterConfig filterConfig
) throws ServletException
{
}
@SuppressWarnings("unchecked")
@Override
public void doFilter(ServletRequest request
, ServletResponse response
, FilterChain chain
)
throws IOException
, ServletException
{
HttpServletRequest httpServletRequest
= (HttpServletRequest
) request
;
ServletRequest servletRequest
= new BodyReaderHttpServletRequestWrapper(httpServletRequest
);
chain
.doFilter(servletRequest
, response
);
}
@Override
public void destroy() {
}
}