直接上源码,在过滤器或拦截器中需要传HttpServletRequest的地方 传MyHttpServletRequestWrapper(HttpServletRequest request)
package com.diandee.api.interceptor;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private String requestBody = null;
public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
if (requestBody == null) {
requestBody = readBody(request);
}
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new CustomServletInputStream(requestBody);
}
private static String readBody(ServletRequest request) {
StringBuilder sb = new StringBuilder();
String inputLine;
BufferedReader br = null;
try {
br = request.getReader();
while ((inputLine = br.readLine()) != null) {
sb.append(inputLine);
}
} catch (IOException e) {
throw new RuntimeException("Failed to read body.", e);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
}
}
}
return sb.toString();
}
private class CustomServletInputStream extends ServletInputStream {
private ByteArrayInputStream buffer;
public CustomServletInputStream(String body) {
body = body == null ? "" : body;
this.buffer = new ByteArrayInputStream(body.getBytes());
}
@Override
public int read() throws IOException {
return buffer.read();
}
@Override
public boolean isFinished() {
return buffer.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener listener) {
throw new RuntimeException("Not implemented");
}
}
}
使用demo
package com.diandee.api.interceptor;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class BodyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Nothig to do
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new MyHttpServletRequestWrapper((HttpServletRequest) request), response);
}
@Override
public void destroy() {
// Nothig to do
}
}