GlobalHttpServletRequestWrapper.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package com.crm.rely.backend.util;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.crm.rely.backend.core.constant.Constants;
  5. import javax.servlet.ReadListener;
  6. import javax.servlet.ServletInputStream;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletRequestWrapper;
  10. import java.io.*;
  11. import java.util.HashMap;
  12. import java.util.Iterator;
  13. import java.util.Map;
  14. public class GlobalHttpServletRequestWrapper extends HttpServletRequestWrapper {
  15. private HttpServletRequest orgRequest = null;
  16. private boolean isIncludeRichText;
  17. public GlobalHttpServletRequestWrapper(HttpServletRequest request, boolean isIncludeRichText) {
  18. super(request);
  19. orgRequest = request;
  20. this.isIncludeRichText = isIncludeRichText;
  21. }
  22. @Override
  23. public ServletInputStream getInputStream() throws IOException {
  24. String result = readBody(orgRequest);
  25. JSONObject jsonObject = JSON.parseObject(result);
  26. for (Map.Entry<String, Object> stringObjectEntry : jsonObject.entrySet()) {
  27. if (stringObjectEntry.getValue() instanceof String) {
  28. stringObjectEntry.setValue(clean(stringObjectEntry.getValue().toString()));
  29. }
  30. }
  31. String content=jsonObject.toJSONString();
  32. return new CustomServletInputStream(content);
  33. }
  34. public static String readBody(ServletRequest request) {
  35. StringBuilder sb = new StringBuilder();
  36. String inputLine;
  37. BufferedReader br = null;
  38. try {
  39. br = request.getReader();
  40. while ((inputLine = br.readLine()) != null) {
  41. sb.append(inputLine);
  42. }
  43. } catch (IOException e) {
  44. throw new RuntimeException("Failed users read body.", e);
  45. } finally {
  46. if (br != null) {
  47. try {
  48. br.close();
  49. } catch (IOException e) {
  50. }
  51. }
  52. }
  53. return sb.toString();
  54. }
  55. /**
  56. * 覆盖getParameter方法,将参数名和参数值都过滤。
  57. * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
  58. * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
  59. */
  60. @Override
  61. public String getParameter(String name) {
  62. Boolean flag = ("content".equals(name) || name.endsWith("WithHtml"));
  63. if (flag && !isIncludeRichText) {
  64. return super.getParameter(name);
  65. }
  66. name = clean(name);
  67. String value = super.getParameter(name);
  68. if (ValidateUtil.vStringNull(value)) {
  69. value = clean(value);
  70. }
  71. return value;
  72. }
  73. @Override
  74. public Map getParameterMap() {
  75. Map map = super.getParameterMap();
  76. // 返回值Map
  77. Map<String, String> returnMap = new HashMap<String, String>();
  78. Iterator entries = map.entrySet().iterator();
  79. Map.Entry entry;
  80. String name = "";
  81. String value = "";
  82. while (entries.hasNext()) {
  83. entry = (Map.Entry) entries.next();
  84. name = (String) entry.getKey();
  85. Object valueObj = entry.getValue();
  86. if (null == valueObj) {
  87. value = "";
  88. } else if (valueObj instanceof String[]) {
  89. String[] values = (String[]) valueObj;
  90. for (int i = 0; i < values.length; i++) {
  91. value = values[i] + ",";
  92. }
  93. value = value.substring(0, value.length() - 1);
  94. } else {
  95. value = valueObj.toString();
  96. }
  97. returnMap.put(name, clean(value).trim());
  98. }
  99. return returnMap;
  100. }
  101. @Override
  102. public String[] getParameterValues(String name) {
  103. String[] arr = super.getParameterValues(name);
  104. if (arr != null) {
  105. for (int i = 0; i < arr.length; i++) {
  106. arr[i] = clean(arr[i]);
  107. }
  108. }
  109. return arr;
  110. }
  111. /**
  112. * 覆盖getHeader方法,将参数名和参数值都过滤。
  113. * 如果需要获得原始的值,则通过super.getHeaders(name)来获取
  114. * getHeaderNames 也可能需要覆盖
  115. */
  116. @Override
  117. public String getHeader(String name) {
  118. name = clean(name);
  119. String value = super.getHeader(name);
  120. if (ValidateUtil.vStringNull(value)) {
  121. value = clean(value);
  122. }
  123. return value;
  124. }
  125. /**
  126. * 获取最原始的request
  127. *
  128. * @return
  129. */
  130. public HttpServletRequest getOrgRequest() {
  131. return orgRequest;
  132. }
  133. /**
  134. * 获取最原始的request的静态方法
  135. *
  136. * @return
  137. */
  138. public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
  139. if (req instanceof GlobalHttpServletRequestWrapper) {
  140. return ((GlobalHttpServletRequestWrapper) req).getOrgRequest();
  141. }
  142. return req;
  143. }
  144. public String clean(String content) {
  145. String result = JsoupUtil.clean(content);
  146. if (SensitiveWordFilterUtil.getSensitiveWordMap() != null && SensitiveWordFilterUtil.getSensitiveWordMap().size() > 0) {
  147. result = SensitiveWordFilterUtil.replaceSensitiveWord(result, Constants.MIN_MACH_TYPE, "");
  148. }
  149. return result;
  150. }
  151. private class CustomServletInputStream extends ServletInputStream {
  152. private ByteArrayInputStream buffer;
  153. public CustomServletInputStream(String body) {
  154. body = body == null ? "" : body;
  155. this.buffer = new ByteArrayInputStream(body.getBytes());
  156. }
  157. @Override
  158. public int read() throws IOException {
  159. return buffer.read();
  160. }
  161. @Override
  162. public boolean isFinished() {
  163. return buffer.available() == 0;
  164. }
  165. @Override
  166. public boolean isReady() {
  167. return true;
  168. }
  169. @Override
  170. public void setReadListener(ReadListener listener) {
  171. throw new RuntimeException("Not implemented");
  172. }
  173. }
  174. }