package com.crm.rely.backend.util; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.crm.rely.backend.core.constant.Constants; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.*; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class GlobalHttpServletRequestWrapper extends HttpServletRequestWrapper { private HttpServletRequest orgRequest = null; private boolean isIncludeRichText; public GlobalHttpServletRequestWrapper(HttpServletRequest request, boolean isIncludeRichText) { super(request); orgRequest = request; this.isIncludeRichText = isIncludeRichText; } @Override public ServletInputStream getInputStream() throws IOException { String result = readBody(orgRequest); JSONObject jsonObject = JSON.parseObject(result); for (Map.Entry stringObjectEntry : jsonObject.entrySet()) { if (stringObjectEntry.getValue() instanceof String) { stringObjectEntry.setValue(clean(stringObjectEntry.getValue().toString())); } } String content=jsonObject.toJSONString(); return new CustomServletInputStream(content); } public 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 users read body.", e); } finally { if (br != null) { try { br.close(); } catch (IOException e) { } } } return sb.toString(); } /** * 覆盖getParameter方法,将参数名和参数值都过滤。 * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取 * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖 */ @Override public String getParameter(String name) { Boolean flag = ("content".equals(name) || name.endsWith("WithHtml")); if (flag && !isIncludeRichText) { return super.getParameter(name); } name = clean(name); String value = super.getParameter(name); if (ValidateUtil.vStringNull(value)) { value = clean(value); } return value; } @Override public Map getParameterMap() { Map map = super.getParameterMap(); // 返回值Map Map returnMap = new HashMap(); Iterator entries = map.entrySet().iterator(); Map.Entry entry; String name = ""; String value = ""; while (entries.hasNext()) { entry = (Map.Entry) entries.next(); name = (String) entry.getKey(); Object valueObj = entry.getValue(); if (null == valueObj) { value = ""; } else if (valueObj instanceof String[]) { String[] values = (String[]) valueObj; for (int i = 0; i < values.length; i++) { value = values[i] + ","; } value = value.substring(0, value.length() - 1); } else { value = valueObj.toString(); } returnMap.put(name, clean(value).trim()); } return returnMap; } @Override public String[] getParameterValues(String name) { String[] arr = super.getParameterValues(name); if (arr != null) { for (int i = 0; i < arr.length; i++) { arr[i] = clean(arr[i]); } } return arr; } /** * 覆盖getHeader方法,将参数名和参数值都过滤。 * 如果需要获得原始的值,则通过super.getHeaders(name)来获取 * getHeaderNames 也可能需要覆盖 */ @Override public String getHeader(String name) { name = clean(name); String value = super.getHeader(name); if (ValidateUtil.vStringNull(value)) { value = clean(value); } return value; } /** * 获取最原始的request * * @return */ public HttpServletRequest getOrgRequest() { return orgRequest; } /** * 获取最原始的request的静态方法 * * @return */ public static HttpServletRequest getOrgRequest(HttpServletRequest req) { if (req instanceof GlobalHttpServletRequestWrapper) { return ((GlobalHttpServletRequestWrapper) req).getOrgRequest(); } return req; } public String clean(String content) { String result = JsoupUtil.clean(content); if (SensitiveWordFilterUtil.getSensitiveWordMap() != null && SensitiveWordFilterUtil.getSensitiveWordMap().size() > 0) { result = SensitiveWordFilterUtil.replaceSensitiveWord(result, Constants.MIN_MACH_TYPE, ""); } return result; } 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"); } } }