| | |
| | | import com.zy.acs.framework.common.R; |
| | | import com.zy.acs.framework.common.SnowflakeIdWorker; |
| | | import com.zy.acs.manager.common.interceptor.IntegrationOpenApiInterceptor.IntegrationRequestContext; |
| | | import com.zy.acs.manager.common.interceptor.IntegrationOpenApiInterceptor.RequestPayload; |
| | | import com.zy.acs.manager.common.utils.IpTools; |
| | | import com.zy.acs.manager.manager.entity.IntegrationRecord; |
| | | import com.zy.acs.manager.manager.enums.IntegrationDirectionType; |
| | |
| | | import org.springframework.http.server.ServerHttpRequest; |
| | | import org.springframework.http.server.ServerHttpResponse; |
| | | import org.springframework.http.server.ServletServerHttpRequest; |
| | | import org.springframework.web.util.ContentCachingRequestWrapper; |
| | | import org.springframework.web.bind.annotation.ControllerAdvice; |
| | | import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletRequestWrapper; |
| | | import java.nio.charset.Charset; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.Map; |
| | | import java.util.UUID; |
| | | |
| | | @Slf4j |
| | |
| | | IntegrationRequestContext context, |
| | | Exception failure) { |
| | | Date now = new Date(); |
| | | RequestPayload payload = context.getPayload(); |
| | | RequestSnapshot payload = buildSnapshot(request); |
| | | |
| | | |
| | | IntegrationRecord record = new IntegrationRecord(); |
| | | record.setUuid(nextUuid()); |
| | |
| | | private String safeToString(Object value) { |
| | | return value == null ? null : String.valueOf(value); |
| | | } |
| | | private RequestSnapshot buildSnapshot(HttpServletRequest request) { |
| | | Map<String, Object> params = flattenParameters(request.getParameterMap()); |
| | | String body = normalizeBody(readBody(request), request.getContentType()); |
| | | return new RequestSnapshot( |
| | | request.getMethod(), |
| | | request.getRequestURI(), |
| | | request.getQueryString(), |
| | | request.getContentType(), |
| | | params.isEmpty() ? null : params, |
| | | body |
| | | ); |
| | | } |
| | | |
| | | private String normalizeBody(String body, String contentType) { |
| | | if (Cools.isEmpty(body)) { |
| | | return null; |
| | | } |
| | | boolean isJson = !Cools.isEmpty(contentType) && contentType.toLowerCase().contains("json"); |
| | | if (isJson) { |
| | | try { |
| | | Object parsed = JSON.parse(body); |
| | | return JSON.toJSONString(parsed, false); |
| | | } catch (Exception ignore) { |
| | | // fall through to compacting whitespace |
| | | } |
| | | } |
| | | return body.replaceAll("[\\n\\r\\t]", "").trim(); |
| | | } |
| | | |
| | | private Map<String, Object> flattenParameters(Map<String, String[]> rawParams) { |
| | | Map<String, Object> flattened = new LinkedHashMap<>(); |
| | | if (rawParams == null) { |
| | | return flattened; |
| | | } |
| | | rawParams.forEach((key, values) -> { |
| | | if (values == null) { |
| | | flattened.put(key, null); |
| | | } else if (values.length == 1) { |
| | | flattened.put(key, values[0]); |
| | | } else { |
| | | flattened.put(key, Arrays.asList(values)); |
| | | } |
| | | }); |
| | | return flattened; |
| | | } |
| | | |
| | | private String readBody(HttpServletRequest request) { |
| | | HttpServletRequest target = unwrapCachingRequest(request); |
| | | if (target instanceof ContentCachingRequestWrapper) { |
| | | ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) target; |
| | | byte[] buffer = wrapper.getContentAsByteArray(); |
| | | if (buffer.length > 0) { |
| | | Charset charset = charset(wrapper.getCharacterEncoding()); |
| | | return new String(buffer, charset); |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private HttpServletRequest unwrapCachingRequest(HttpServletRequest request) { |
| | | HttpServletRequest current = request; |
| | | while (current instanceof HttpServletRequestWrapper) { |
| | | if (current instanceof ContentCachingRequestWrapper) { |
| | | return current; |
| | | } |
| | | current = (HttpServletRequest) ((HttpServletRequestWrapper) current).getRequest(); |
| | | } |
| | | return request; |
| | | } |
| | | |
| | | private Charset charset(String encoding) { |
| | | if (Cools.isEmpty(encoding)) { |
| | | return StandardCharsets.UTF_8; |
| | | } |
| | | try { |
| | | return Charset.forName(encoding); |
| | | } catch (Exception e) { |
| | | return StandardCharsets.UTF_8; |
| | | } |
| | | } |
| | | |
| | | private static class RequestSnapshot { |
| | | private final String method; |
| | | private final String uri; |
| | | private final String query; |
| | | private final String contentType; |
| | | private final Map<String, Object> parameters; |
| | | private final String body; |
| | | |
| | | RequestSnapshot(String method, String uri, String query, String contentType, |
| | | Map<String, Object> parameters, String body) { |
| | | this.method = method; |
| | | this.uri = uri; |
| | | this.query = query; |
| | | this.contentType = contentType; |
| | | this.parameters = parameters; |
| | | this.body = body; |
| | | } |
| | | |
| | | public String getUri() { |
| | | return uri; |
| | | } |
| | | } |
| | | } |