1.基本数据类型,2.POJO类型,3.数组类型,4.集合类型
public class RequestStringProcessor extends HttpServletRequestWrapper {
private static final Log log=LogFactory.getLog(RequestStringProcessor.class);
private byte[] requestBody;
private Charset charSet;
private static final String REQUEST_BODY_TYPE = "application/json";
/**
* 前台请求类型分三种
* 1.application/x-www-form-urlencoded; charset=UTF-8 String类型
* 2.application/json;charset=UTF-8 RequestBody类型
* 3.其他如:mutipart/form-data,application/json,application/xml
* mutipart/form-data 类型 RequestBody无法处理,只能处理application/json,application/xml
* @param request
*/
public RequestStringProcessor(HttpServletRequest request) {
super(request);
//缓存请求body
getRequestBody(request);
}
/**
* 过滤RequestBody内容
* @param request
*/
private void getRequestBody(HttpServletRequest request) {
String contentType=request.getContentType();
if(contentType==null||contentType.indexOf(REQUEST_BODY_TYPE)<0) {
//请求的contentType为空或不是json格式
return;
}
String charSetName = request.getCharacterEncoding();
if (charSetName == null) {
charSetName = "UTF-8";
}
charSet = Charset.forName(charSetName);
try {
//获取前台传输的RequestBody字符串内容
String bodyContent = StreamUtils.copyToString(request.getInputStream(), charSet);
bodyContent=StringUtil.getFilterString(bodyContent);
boolean isJson=cn.hutool.json.JSONUtil.isJson(bodyContent);
if(isJson) {
if(JSONUtil.isJsonArray(bodyContent)) {
JSONArray resultJson=JSONObject.parseArray(bodyContent);
requestBody = resultJson.toString().getBytes(charSet);
}else {
JSONObject resultJson = JSONObject.parseObject(bodyContent);
requestBody = resultJson.toString().getBytes(charSet);
}
}else {
requestBody = new byte[0];
}
} catch (Exception e) {
log.error("RequestBody请求获取失败...",e);
}
}
@Override
public String getParameter(String name) {
// 返回值之前 先进行过滤
return StringUtil.getFilterString(super.getParameter(name));
}
@Override
public String[] getParameterValues(String name) {
// 返回值之前 先进行过滤
String[] values = super.getParameterValues(name);
if(values==null){
return null;
}
for (int i = 0; i < values.length; i++) {
values[i] = StringUtil.getFilterString(values[i]);
}
return values;
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> paramMap = super.getParameterMap();
Set<Entry<String, String[]>> set = paramMap.entrySet();
Iterator<Entry<String, String[]>> iters = set.iterator();
while (iters.hasNext()) {
Entry<String, String[]> key = iters.next();
String[] value = paramMap.get(key.getKey());
paramMap.put(key.getKey(), StringUtil.getFilterString(value));
}
return paramMap;
}
/**
* 获取前台输入的请求参数文件流
* RequestBody以Stream方式进行传输
*/
public ServletInputStream getInputStream() {
if (requestBody == null) {
requestBody = new byte[0];
}
final ByteArrayInputStream requestStream = new ByteArrayInputStream(requestBody);
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 requestStream.read();
}
};
}
}
Filter代码
@WebFilter(filterName="requestStringFilter",urlPatterns="/*")
public class RequestStringFilter extends OncePerRequestFilter {
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
chain.doFilter(new RequestStringProcessor((HttpServletRequest)request), response);
}
}
还有其他的类似解决办法可参考: