创建HttpServletRequest包装类
package cn.xxx.xxx.config.HttpBodyConfig;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import cn.lexisnexisrisk.board.admin.config.HttpBodyConfig.HttpHelper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final byte[] body;
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
String bodyString = HttpHelper.getBodyString(request);
body = bodyString.getBytes(Charset.forName("UTF-8"));
}
@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) {
}
};
}
}
创建过滤器对request包装
package cn.xxx.xxx.config.HttpBodyConfig;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
@WebFilter(filterName = "httpServletRequestWrapperFilter" , urlPatterns = "/*")
public class HttpServletRequestWrapperFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
// 遇到post方法才对request进行包装
String methodType = httpRequest.getMethod();
// 上传文件时同样不进行包装
String servletPath = httpRequest.getRequestURI().toString();
if ("POST".equals(methodType) && !servletPath.contains("/material/upload")) {
requestWrapper = new BodyReaderHttpServletRequestWrapper(
(HttpServletRequest) request);
}
}
if (null == requestWrapper) {
chain.doFilter(request, response);
} else {
chain.doFilter(requestWrapper, response);
}
}
@Override
public void destroy() {
}
}
读取流工具类
package cn.xxx.xxx.config.HttpBodyConfig;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class HttpHelper {
public static String getBodyString(HttpServletRequest request) throws IOException {
StringBuilder sb = new StringBuilder();
InputStream inputStream = null;
BufferedReader reader = null;
try {
inputStream = request.getInputStream();
reader = new BufferedReader(
new InputStreamReader(inputStream, Charset.forName("UTF-8")));
char[] bodyCharBuffer = new char[1024];
int len = 0;
while ((len = reader.read(bodyCharBuffer)) != -1) {
sb.append(new String(bodyCharBuffer, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
JsonObj 按照key排序
public static Map<String,Object> sortMapByKey(Map<String,Object> map){
if(map == null || map.isEmpty()){
return null;
}
Map<String,Object> sortMap = new TreeMap<String,Object>(new MapKeyComparator());
sortMap.putAll(map);
return sortMap;
}
class MapKeyComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}
public static JSONObject getJson(HttpServletRequest request){
String result = "";
BufferedReader in = null;
try {
in= new BufferedReader(new InputStreamReader(
request.getInputStream(),"utf-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return (JSONObject) JSONObject.parse(result);
}
public void test(){
JSONObject reqBody = getJson(request);
Map<String, Object> stringObjectMap = sortMapByKey(JSONObject.parseObject(reqBody.toJSONString(), new TypeReference<Map<String, Object>>() {
}));
System.out.println(JSON.toJSONString(stringObjectMap));
}