MyRequestWrapper.java 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package jnpf.wrapper;
  2. import cn.dev33.satoken.context.SaHolder;
  3. import cn.hutool.core.net.url.UrlQuery;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONObject;
  6. import jnpf.constant.GlobalConst;
  7. import jnpf.handler.IRestHandler;
  8. import jnpf.util.StringUtil;
  9. import lombok.Getter;
  10. import lombok.Setter;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.http.MediaType;
  13. import org.springframework.util.StreamUtils;
  14. import org.springframework.util.StringUtils;
  15. import jakarta.servlet.ReadListener;
  16. import jakarta.servlet.ServletInputStream;
  17. import jakarta.servlet.http.HttpServletRequest;
  18. import jakarta.servlet.http.HttpServletRequestWrapper;
  19. import java.io.*;
  20. import java.nio.charset.StandardCharsets;
  21. import java.util.*;
  22. import java.util.stream.Collectors;
  23. /**
  24. * Request封装
  25. * 处理类型:
  26. * application/json
  27. * application/x-www-form-urlencoded
  28. */
  29. @Slf4j
  30. public class MyRequestWrapper extends HttpServletRequestWrapper {
  31. protected Map<String, String[]> paramHashValues;
  32. @Getter
  33. @Setter
  34. protected String requestBody = null;
  35. protected HttpServletRequest req;
  36. private final List<IRestHandler> handlers;
  37. private final String[] EMPTY_ARRAY = new String[0];
  38. /**
  39. * 是否需要处理Header, Body, Form
  40. */
  41. private boolean supportHeader, supportBody, supportParameter;
  42. public MyRequestWrapper(HttpServletRequest request, List<IRestHandler> handlers) throws IOException {
  43. super(request);
  44. this.req = request;
  45. this.handlers = handlers == null ? Collections.emptyList() : handlers;
  46. if(!handlers.isEmpty()){
  47. try {
  48. if (isJsonBodyRequest()) {
  49. if(this.handlers.stream().anyMatch(IRestHandler::supportBodyJson)) {
  50. processBody();
  51. }
  52. } else if (isParameterRequest()) {
  53. if(this.handlers.stream().anyMatch(IRestHandler::supportParameter)) {
  54. processParameter();
  55. }
  56. if(this.handlers.stream().anyMatch(IRestHandler::supportBodyJson)) {
  57. processFormBody();
  58. }
  59. }
  60. } catch (Exception e){
  61. log.error("请求解析失败:{}", SaHolder.getRequest().getRequestPath());
  62. throw e;
  63. }
  64. }
  65. }
  66. public void wrapperRequestData() throws IOException {
  67. try {
  68. if (isJsonBodyRequest()) {
  69. processBody();
  70. } else if (isParameterRequest()) {
  71. processParameter();
  72. processFormBody();
  73. }
  74. } catch (Exception e){
  75. log.error("请求解析失败:{}", SaHolder.getRequest().getRequestPath());
  76. throw e;
  77. }
  78. }
  79. private void processBody() throws IOException {
  80. List<IRestHandler> bodyHandlers = this.handlers.stream().filter(IRestHandler::supportBodyJson).collect(Collectors.toList());
  81. this.requestBody = convertInputStreamToString(req.getInputStream());
  82. if (StringUtil.isNotEmpty(this.requestBody)) {
  83. JSON jsonData = (JSON) JSON.parse(this.requestBody);
  84. for (IRestHandler bodyHandler : bodyHandlers) {
  85. jsonData = bodyHandler.initBodyJson(jsonData);
  86. }
  87. requestBody = jsonData.toJSONString();
  88. supportBody = true;
  89. }
  90. }
  91. private void processParameter(){
  92. List<IRestHandler> parameterHandlers = this.handlers.stream().filter(IRestHandler::supportParameter).collect(Collectors.toList());
  93. paramHashValues = new HashMap<>();
  94. paramHashValues.putAll(req.getParameterMap());
  95. /*
  96. //解除锁定直接添加
  97. if(paramHashValues instanceof ParameterMap){
  98. ((ParameterMap<String, String[]>) paramHashValues).setLocked(false);
  99. }
  100. */
  101. parameterHandlers.forEach(h -> paramHashValues = h.initParameter(paramHashValues));
  102. supportParameter = true;
  103. }
  104. private void processFormBody() throws IOException {
  105. List<IRestHandler> bodyHandlers = this.handlers.stream().filter(IRestHandler::supportBodyJson).collect(Collectors.toList());
  106. this.requestBody = convertInputStreamToString(req.getInputStream());
  107. if(StringUtil.isNotEmpty(this.requestBody)){
  108. Map<CharSequence, CharSequence> uriToListToMap = new UrlQuery().parse(this.requestBody, GlobalConst.DEFAULT_CHARSET).getQueryMap();
  109. requestBody = JSONObject.toJSONString(uriToListToMap);
  110. }
  111. if (StringUtil.isNotEmpty(this.requestBody)) {
  112. JSON jsonData = (JSON) JSON.parse(this.requestBody);
  113. for (IRestHandler bodyHandler : bodyHandlers) {
  114. jsonData = bodyHandler.initBodyJson(jsonData);
  115. }
  116. Map<String, Object> formJson = (JSONObject) jsonData;
  117. UrlQuery urlQuery = new UrlQuery();
  118. for (Map.Entry<String, Object> entry : formJson.entrySet()) {
  119. urlQuery.add(entry.getKey(), entry.getValue());
  120. }
  121. requestBody = urlQuery.build(GlobalConst.DEFAULT_CHARSET);
  122. supportBody = true;
  123. }
  124. }
  125. @Override
  126. public BufferedReader getReader() throws IOException {
  127. if(supportBody){
  128. return new BufferedReader(new StringReader(requestBody));
  129. }else{
  130. return super.getReader();
  131. }
  132. }
  133. @Override
  134. public ServletInputStream getInputStream() throws IOException {
  135. if(supportBody){
  136. return new ServletInputStream() {
  137. private InputStream in = new ByteArrayInputStream(
  138. requestBody.getBytes(req.getCharacterEncoding()));
  139. @Override
  140. public int read() throws IOException {
  141. return in.read();
  142. }
  143. @Override
  144. public boolean isFinished() {
  145. return false;
  146. }
  147. @Override
  148. public boolean isReady() {
  149. return false;
  150. }
  151. @Override
  152. public void setReadListener(ReadListener readListener) {
  153. }
  154. };
  155. }else {
  156. return super.getInputStream();
  157. }
  158. }
  159. @Override
  160. public Map<String, String[]> getParameterMap() {
  161. if(supportParameter){
  162. return this.paramHashValues;
  163. }else {
  164. return super.getParameterMap();
  165. }
  166. }
  167. @Override
  168. public String getParameter(String name) {
  169. if(supportParameter){
  170. String[] parameter = this.paramHashValues.getOrDefault(name, EMPTY_ARRAY);
  171. return parameter.length == 0 ? null: parameter[0];
  172. }else {
  173. return super.getParameter(name);
  174. }
  175. }
  176. @Override
  177. public String[] getParameterValues(String name) {
  178. if(supportParameter){
  179. return this.paramHashValues.get(name);
  180. }else {
  181. return super.getParameterValues(name);
  182. }
  183. }
  184. @Override
  185. public Enumeration<String> getParameterNames() {
  186. if(supportParameter){
  187. return Collections.enumeration(this.paramHashValues.keySet());
  188. }else {
  189. return super.getParameterNames();
  190. }
  191. }
  192. public void addAllParameters(Map<String, Object> otherParams) {// 增加多个参数
  193. for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
  194. addParameter(entry.getKey(), entry.getValue());
  195. }
  196. }
  197. public void addParameter(String name, Object value) {// 增加参数
  198. if (value != null && paramHashValues != null) {
  199. if (value instanceof String[]) {
  200. paramHashValues.put(name, (String[]) value);
  201. } else if (value instanceof String) {
  202. paramHashValues.put(name, new String[]{(String) value});
  203. } else {
  204. paramHashValues.put(name, new String[]{String.valueOf(value)});
  205. }
  206. }
  207. }
  208. protected boolean isParameterRequest(){
  209. String contentType = this.req.getContentType();
  210. if(StringUtil.isNotEmpty(contentType)) {
  211. if (StringUtils.substringMatch(contentType, 0, MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
  212. return true;
  213. }
  214. }
  215. return false;
  216. }
  217. protected boolean isJsonBodyRequest(){
  218. String contentType = this.req.getContentType();
  219. if(StringUtil.isNotEmpty(contentType)) {
  220. if (StringUtils.substringMatch(contentType, 0, MediaType.APPLICATION_JSON_VALUE)) {
  221. return true;
  222. }
  223. }
  224. return false;
  225. }
  226. protected String convertInputStreamToString(InputStream inputStream) throws IOException {
  227. return StreamUtils.copyToString(inputStream, GlobalConst.DEFAULT_CHARSET);
  228. }
  229. }