springboot 记录http请求和返回信息

首先导入pom包:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

配置yml:

management:
  endpoints:
    web:
      exposure:
        include=httptrace: httptrace

添加两个配置类:

1#

package com.demo.config;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.micrometer.core.instrument.MeterRegistry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import org.springframework.web.util.WebUtils;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.LocalDateTime;
import java.util.*;


@Slf4j
public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered {
	private static final String NEED_TRACE_PATH_PREFIX = "/api";
	private static final String IGNORE_CONTENT_TYPE = "multipart/form-data";
	private static final ObjectMapper mapper = new ObjectMapper();

	private final MeterRegistry registry;

	public HttpTraceLogFilter(MeterRegistry registry) {
		this.registry = registry;
	}

	@Override
	public int getOrder() {
		return Ordered.LOWEST_PRECEDENCE - 10;
	}

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		if (!isRequestValid(request)) {
			filterChain.doFilter(request, response);
			return;
		}
		ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
		ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
		var startTime = LocalDateTime.now();
		try {
			filterChain.doFilter(requestWrapper, responseWrapper);
		} finally {
			String path = request.getRequestURI();
			if (path.startsWith(NEED_TRACE_PATH_PREFIX) && !Objects.equals(IGNORE_CONTENT_TYPE, request.getContentType())) {
				//创建一个 json 对象,用来存放 http 日志信息
				ObjectNode rootNode = mapper.createObjectNode();
				rootNode.put("uri", path);
				rootNode.put("clientIp", requestWrapper.getRemoteAddr());
				rootNode.put("startTime", startTime.toString());
				rootNode.put("endTime", LocalDateTime.now().toString());
				rootNode.set("requestHeaders", mapper.valueToTree(getRequestHeaders(requestWrapper)));
				String method = request.getMethod();
				rootNode.put("method", method);
				if ("GET".equals(method)) {
					rootNode.set("request", mapper.valueToTree(requestWrapper.getParameterMap()));
				} else {
					JsonNode newNode = mapper.readTree(requestWrapper.getContentAsByteArray());
					rootNode.set("request", newNode);
				}
				rootNode.put("httpStatus", responseWrapper.getStatusCode());
				try {
					JsonNode newNode = mapper.readTree(responseWrapper.getContentAsByteArray());
					rootNode.set("response", newNode);
				} catch (Exception e) {
					rootNode.put("response", new String(responseWrapper.getContentAsByteArray()));
				}
				responseWrapper.copyBodyToResponse();
				rootNode.set("responseHeaders", mapper.valueToTree(getResponseHeaders(responseWrapper)));
				log.info(rootNode.toString());
			}
		}
		updateResponse(responseWrapper);
	}

	private boolean isRequestValid(HttpServletRequest request) {
		try {
			new URI(request.getRequestURL().toString());
			return true;
		} catch (URISyntaxException ex) {
			return false;
		}
	}

	/**
	 * 组装请求参数
	 *
	 * @param request
	 * @return
	 */
	private Map<String, Object> getRequestHeaders(HttpServletRequest request) {
		Map<String, Object> headers = new HashMap<>();
		Enumeration<String> headerNames = request.getHeaderNames();
		while (headerNames.hasMoreElements()) {
			String headerName = headerNames.nextElement();
			headers.put(headerName, request.getHeader(headerName));
		}
		return headers;

	}

	/**
	 * 组装返回参数
	 *
	 * @param response
	 * @return
	 */
	private Map<String, Object> getResponseHeaders(ContentCachingResponseWrapper response) {
		Map<String, Object> headers = new HashMap<>();
		Collection<String> headerNames = response.getHeaderNames();
		for (String headerName : headerNames) {
			headers.put(headerName, response.getHeader(headerName));
		}
		return headers;
	}

	/**
	 * 还原返回
	 *
	 * @param response
	 * @throws IOException
	 */
	private void updateResponse(HttpServletResponse response) throws IOException {
		ContentCachingResponseWrapper responseWrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class);
		Objects.requireNonNull(responseWrapper).copyBodyToResponse();
	}
}

2#

package com.demo.config;

import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnWebApplication
public class HttpTraceConfiguration {
	@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
	static class ServletTraceFilterConfiguration {

		@Bean
		public HttpTraceLogFilter httpTraceLogFilter(MeterRegistry registry) {
			return new HttpTraceLogFilter(registry);
		}

	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中请求第三方的WebService,可以使用以下步骤: 1. 首先,需要导入相关的依赖包。可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> ``` 这样就可以使用Spring Boot提供的WebService相关功能。 2. 创建一个WebServiceClient类,可以继承自抽象类WebServiceClient,并添加连接信息。在该类中,可以使用JaxWsProxyFactoryBean来创建服务代理,并设置相关属性,如地址、服务类等。同时,可以添加一些拦截器,如LoggingInInterceptor和LoggingOutInterceptor,用于记录入站和出站消息。如果服务端要求验证用户密码,还可以添加AddSoapHeader拦截器来添加消息头验证信息。 3. 在调用WebService的地方,可以使用WebServiceClient类的callService方法来创建服务代理并返回。可以根据需要传入不同的服务类。 4. 使用WebServiceTemplate实现调用WebService接口。可以根据提供的XSDL文档编写相关代码。在请求中,需要设置请求的URL、Content-Type、SOAPAction等信息,并提供请求的XML内容。 以上是使用Spring Boot请求第三方WebService的一般步骤。具体的实现可以根据实际情况进行调整和扩展。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [SpringBoot调用第三方WebService接口的两种实现方式](https://blog.csdn.net/m0_37742400/article/details/130691229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SprintBoot 调用webService接口](https://blog.csdn.net/RUN166/article/details/126536183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值