目录
2.1、自定义HttpServletRequestWrapper
2.2、JsonRequestHeaderParamsHelper
2.3、HttpServletRequestReplacedFilter
1、背景
2、解决方案
2.1、自定义HttpServletRequestWrapper
由于请求信息存储在流中,只能调用一次,因此将其存储到字节数组中,保证之后调用getReader()和getInputStream()均通过body数组来获取数据。
public class BodyReaderHttpServletRequestWrapper extends
HttpServletRequestWrapper {
private final byte[] body;
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request)
throws IOException {
super(request);
body = JsonRequestHeaderParamsHelper.bufferReaderToString(request.getReader()).getBytes();
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = 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() {
return byteArrayInputStream.read();
}
};
}
}
2.2、JsonRequestHeaderParamsHelper
@Slf4j
public class JsonRequestHeaderParamsHelper {
public static JSONObject parseHeader(ServletRequest request) throws IOException {
return JSON.parseObject(bufferReaderToString(request.getReader()));
}
public static String bufferReaderToString(BufferedReader reader) throws IOException {
StringBuilder sb = new StringBuilder();
try {
char[] buff = new char[1024];
int len;
while ((len = reader.read(buff)) != -1) {
sb.append(buff, 0, len);
}
} catch (IOException e) {
log.error("bufferReaderToString error", e);
}
return sb.toString();
}
}
2.3、HttpServletRequestReplacedFilter
@Slf4j
@Order(value = 0)
@WebFilter(filterName = "httpServletRequestReplacedFilter", urlPatterns = "/*")
public class HttpServletRequestReplacedFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("进入HttpServletRequestReplacedFilter");
ServletRequest requestWrapper = null;
if(request instanceof HttpServletRequest) {
requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
}
if(null == requestWrapper) {
chain.doFilter(request, response);
} else {
chain.doFilter(requestWrapper, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
2.4、使用
之后就可以愉快地使用request.getParameter,@RequestBody等等了。
附上get和post手动获取请求参数的方法:
if("GET".equals(request.getMethod())|| "DELETE".equals(request.getMethod())) {
JSONObject jsonObject = JSONObject.fromObject(request.getParameterMap());
params=jsonObject.toString();
log.info("get请求参数为:{}", params);
}else {
com.alibaba.fastjson.JSONObject jsonObject =JsonRequestHeaderParamsHelper.parseHeader(request);
params=jsonObject.toJSONString();
log.info("post请求参数为:{}",params);
}
如果对你有帮助,点赞、收藏、关注是我更新的动力!