From 79bb4a0046debf76c1b816ef0b6a625d0a62a9d6 Mon Sep 17 00:00:00 2001 From: liaozan <378024053@qq.com> Date: Tue, 5 Sep 2023 17:01:50 +0800 Subject: [PATCH] Skip wrap request if request is not a application/json post request --- .../argument/BodyParamMethodArgumentResolver.java | 5 ++--- .../web/utils/RequestContentCachingUtils.java | 14 ++++++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java b/commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java index e0746fd..ed6c79b 100644 --- a/commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java +++ b/commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java @@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.schbrain.common.util.JacksonUtils; import com.schbrain.common.web.annotation.BodyParam; -import com.schbrain.common.web.servlet.ContentCachingRequest; import lombok.Setter; import org.springframework.core.MethodParameter; import org.springframework.util.Assert; @@ -68,14 +67,14 @@ public class BodyParamMethodArgumentResolver extends AbstractNamedValueMethodArg private JsonNode getRequestBody(NativeWebRequest nativeWebRequest) throws IOException { JsonNode requestBody = (JsonNode) nativeWebRequest.getAttribute(REQUEST_BODY_CACHE, SCOPE_REQUEST); if (requestBody == null) { - ContentCachingRequest request = wrapRequest(nativeWebRequest); + HttpServletRequest request = wrapRequest(nativeWebRequest); requestBody = objectMapper.readTree(request.getInputStream()); nativeWebRequest.setAttribute(REQUEST_BODY_CACHE, requestBody, SCOPE_REQUEST); } return requestBody; } - private ContentCachingRequest wrapRequest(NativeWebRequest request) { + private HttpServletRequest wrapRequest(NativeWebRequest request) { return wrapIfRequired(request.getNativeRequest(HttpServletRequest.class)); } diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java b/commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java index b1f87e7..0e0f5d2 100644 --- a/commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java +++ b/commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java @@ -3,10 +3,13 @@ package com.schbrain.common.web.utils; import com.schbrain.common.util.ValidateUtils; import com.schbrain.common.web.servlet.ContentCachingRequest; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; import javax.servlet.http.HttpServletRequest; +import static org.springframework.http.HttpMethod.POST; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import static org.springframework.web.util.WebUtils.getNativeRequest; /** @@ -19,10 +22,10 @@ public class RequestContentCachingUtils { /** * Make request content cacheable to avoid stream closed error after inputStream closed */ - public static ContentCachingRequest wrapIfRequired(HttpServletRequest request) { + public static HttpServletRequest wrapIfRequired(HttpServletRequest request) { ValidateUtils.notNull(request, "request must not be null"); - if (request instanceof ContentCachingRequest) { - return (ContentCachingRequest) request; + if (request instanceof ContentCachingRequest || !isJsonPostRequest(request)) { + return request; } else { return new ContentCachingRequest(request); } @@ -43,10 +46,13 @@ public class RequestContentCachingUtils { public static String getRequestBody(HttpServletRequest request, String characterEncoding) { ContentCachingRequest requestToUse = getNativeRequest(request, ContentCachingRequest.class); if (requestToUse == null) { - log.warn("request is not an instance of {}", ContentCachingRequest.class.getSimpleName()); return null; } return requestToUse.getContentAsString(characterEncoding); } + private static boolean isJsonPostRequest(HttpServletRequest request) { + return POST.matches(request.getMethod()) && StringUtils.contains(request.getContentType(), APPLICATION_JSON_VALUE); + } + } -- GitLab