| | |
| | | |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.manager.common.annotation.IntegrationAuth; |
| | | import com.zy.acs.manager.core.domain.type.NamespaceType; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.core.annotation.AnnotatedElementUtils; |
| | | import org.springframework.stereotype.Component; |
| | |
| | | import java.nio.charset.Charset; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.Arrays; |
| | | import java.util.Collections; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | |
| | | @Component |
| | | public class IntegrationOpenApiInterceptor implements HandlerInterceptor { |
| | | |
| | | private static final String ATTR_APP_AUTH = "appAuth"; |
| | | private static final String ATTR_AUTH_MEMO = "integrationAuthMemo"; |
| | | private static final String ATTR_CACHE = "cache"; |
| | | private static final String ATTR_START_AT = "openApiStartTime"; |
| | | private static final String ATTR_CONTEXT = IntegrationOpenApiInterceptor.class.getName() + ".CONTEXT"; |
| | | |
| | | @Override |
| | | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { |
| | |
| | | } |
| | | HandlerMethod handlerMethod = (HandlerMethod) handler; |
| | | IntegrationAuth integrationAuth = findIntegrationAuth(handlerMethod); |
| | | if (integrationAuth == null) { |
| | | log.debug("Skip open-api logging for {} because @IntegrationAuth is missing", handlerMethod.getMethod()); |
| | | if (integrationAuth == null || integrationAuth.value() == IntegrationAuth.Enable.SKIP_LOG) { |
| | | return true; |
| | | } |
| | | |
| | | request.setAttribute(ATTR_APP_AUTH, integrationAuth.value()); |
| | | if (!Cools.isEmpty(integrationAuth.memo())) { |
| | | request.setAttribute(ATTR_AUTH_MEMO, integrationAuth.memo()); |
| | | } |
| | | request.setAttribute(ATTR_START_AT, System.currentTimeMillis()); |
| | | request.setAttribute(ATTR_CACHE, buildRequestCache(request)); |
| | | NamespaceType namespaceType = integrationAuth.name() == null ? NamespaceType.NONE : integrationAuth.name(); |
| | | IntegrationRequestContext context = new IntegrationRequestContext( |
| | | namespaceType, |
| | | handlerMethod.getBeanType().getSimpleName() + "#" + handlerMethod.getMethod().getName(), |
| | | System.currentTimeMillis(), |
| | | buildPayload(request) |
| | | ); |
| | | request.setAttribute(ATTR_CONTEXT, context); |
| | | return true; |
| | | } |
| | | |
| | | public static IntegrationRequestContext getContext(HttpServletRequest request) { |
| | | Object attribute = request.getAttribute(ATTR_CONTEXT); |
| | | if (attribute instanceof IntegrationRequestContext) { |
| | | return (IntegrationRequestContext) attribute; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private IntegrationAuth findIntegrationAuth(HandlerMethod handlerMethod) { |
| | |
| | | return AnnotatedElementUtils.findMergedAnnotation(handlerMethod.getBeanType(), IntegrationAuth.class); |
| | | } |
| | | |
| | | private Map<String, Object> buildRequestCache(HttpServletRequest request) { |
| | | Map<String, Object> cache = new LinkedHashMap<>(); |
| | | cache.put("method", request.getMethod()); |
| | | cache.put("uri", request.getRequestURI()); |
| | | cache.put("query", request.getQueryString()); |
| | | cache.put("parameters", flattenParameters(request.getParameterMap())); |
| | | cache.put("headers", extractHeaders(request)); |
| | | private RequestPayload buildPayload(HttpServletRequest request) { |
| | | Map<String, Object> params = flattenParameters(request.getParameterMap()); |
| | | String body = readBody(request); |
| | | if (!Cools.isEmpty(body)) { |
| | | cache.put("body", body); |
| | | } |
| | | return cache; |
| | | return new RequestPayload( |
| | | request.getMethod(), |
| | | request.getRequestURI(), |
| | | request.getQueryString(), |
| | | request.getContentType(), |
| | | params.isEmpty() ? null : params, |
| | | Cools.isEmpty(body) ? null : body |
| | | ); |
| | | } |
| | | |
| | | private Map<String, Object> flattenParameters(Map<String, String[]> rawParams) { |
| | |
| | | } |
| | | }); |
| | | return flattened; |
| | | } |
| | | |
| | | private Map<String, Object> extractHeaders(HttpServletRequest request) { |
| | | Map<String, Object> headers = new LinkedHashMap<>(); |
| | | List<String> names = Collections.list(request.getHeaderNames()); |
| | | for (String name : names) { |
| | | headers.put(name, request.getHeader(name)); |
| | | } |
| | | return headers; |
| | | } |
| | | |
| | | private String readBody(HttpServletRequest request) { |
| | |
| | | return StandardCharsets.UTF_8; |
| | | } |
| | | } |
| | | |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public static class IntegrationRequestContext { |
| | | private final NamespaceType namespaceType; |
| | | private final String handler; |
| | | private final long startAt; |
| | | private final RequestPayload payload; |
| | | } |
| | | |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public static class RequestPayload { |
| | | 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; |
| | | } |
| | | } |