首先我们需要将所有的请求过滤,使用AOP对每个请求做处理,在使用@RequestBody注解的时候,其框架底层调用了getInputStream()方法,因此我们需要重写该方法
获取请求体,在方法参数中加入ServletRequest参数,(纯手写不易,如有写错的字母请留意)
public static String getBodyString(ServletRequest request){
StringBuffer sb = new StringBuffer();
InputStream inputStream = null;
BufferedReader reader = null;
try{
inputStream = request.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream,Charset.forName("UTF-8")));
String line = "";
while((line = reader.readLine())!=null){
sb.append(line);
}
}catch(IOException e){
e.printStackTeace();
}finally{
if(inputStream != null){
try{
inputStream.close();
}catch(IOException e){e.printStackTeace();}
}if(reader != null){
try{
reader.close();
}catch(IOException e){e.printStackTeace();}
}
}
return sb.toString();
}
重写getInputStream()方法:
@Override
public ServletInputStream getInputStream() throws IOException{
String body = 上面的方法(this.getRequest);//this.getRequest该方法为该类继承HttpServletRequestWrapper类中方法
ServletInputStream inputStream = null;
if(StringUtils.isNotEmpty(body)){
if(isJsonStr(body)){//判断body内容是不是json,该方法自行百度,手写确实较累见谅
JSON jsonObject = (JSON) JSON.parse(body);
jsonExec(jsonObject);
body = jsonObject.toJSONString();
}else{
body = cleanXSS(body);//写一个方法,将字符串里面的js脚本全部用""替换,例如"<"、"script"等,全部用replaceAll替换""即可
}
inputStream = new PostServletInputStream(body);
}
return inputStream;
}
//对jsonArray和jsonObject做递归处理
private void jsonExec(Object obj){
if(obj instanceof JSONObject){
cleanXSSForJsonStr((JSONObject) obj);//对json数据进行处理,取出来再用map存
}else if(obj instanceof JSONArray){
JSONArray jsonArray = (JSONArray) obj;
jsonArray.forEach(array -> {
if(array instanceof JSONObject || array instanceof JSONArray){
jsonExec(array);
}else{
int index = jsonArray.indexOf(array);
jsonArray.set(index,cleanXSS(String.valueOf(array)));//同理,取出来用map存
}
});
}
}