Spring Boot SOAP WebService拦截器开发:记录请求头与Body及配置示例
Spring Boot SOAP WebService 请求日志拦截器实现
一、自定义请求日志拦截器
创建拦截器类继承EndpointInterceptorAdapter,重写handleRequest方法,在端点方法执行前解析并记录SOAP请求头和请求体。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ws.context.MessageContext; import org.springframework.ws.server.EndpointInterceptorAdapter; import org.springframework.ws.soap.SoapMessage; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.StringWriter; public class SoapRequestLoggingInterceptor extends EndpointInterceptorAdapter { private static final Logger logger = LoggerFactory.getLogger(SoapRequestLoggingInterceptor.class); @Override public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception { SoapMessage soapRequest = (SoapMessage) messageContext.getRequest(); // 记录SOAP请求头 logger.info("SOAP Request Headers:\n{}", soapRequest.getSoapHeader().getSource()); // 转换并记录SOAP请求体 Transformer transformer = TransformerFactory.newInstance().newTransformer(); StringWriter writer = new StringWriter(); transformer.transform(soapRequest.getEnvelope().getSource(), new StreamResult(writer)); logger.info("SOAP Request Body:\n{}", writer.toString()); // 返回true允许请求继续流向端点方法,返回false终止请求处理 return true; } }
二、注册拦截器
在SOAP WebService配置类中注册自定义拦截器,确保拦截器生效。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.ws.config.annotation.EnableWs; import org.springframework.ws.config.annotation.WsConfigurerAdapter; import org.springframework.ws.server.EndpointInterceptor; import java.util.List; @EnableWs @Configuration public class WebServiceConfig extends WsConfigurerAdapter { // 声明拦截器Bean @Bean public EndpointInterceptor soapRequestLoggingInterceptor() { return new SoapRequestLoggingInterceptor(); } // 将拦截器添加到全局拦截器列表 @Override public void addInterceptors(List<EndpointInterceptor> interceptors) { interceptors.add(soapRequestLoggingInterceptor()); super.addInterceptors(interceptors); } // 此处可添加你的WSDL定义、XSD Schema等其他SOAP配置 // 示例: /* @Bean public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema demoSchema) { DefaultWsdl11Definition wsdlDefinition = new DefaultWsdl11Definition(); wsdlDefinition.setPortTypeName("DemoPort"); wsdlDefinition.setLocationUri("/soap-services"); wsdlDefinition.setTargetNamespace("http://your-domain.com/demo"); wsdlDefinition.setSchema(demoSchema); return wsdlDefinition; } @Bean public XsdSchema demoSchema() { return new SimpleXsdSchema(new ClassPathResource("demo.xsd")); } */ }
三、配置位置说明
- 拦截器类:建议放在项目专属的拦截器包下(如
com.yourcompany.ws.interceptor),便于统一管理。 - 配置类
WebServiceConfig:需放置在Spring Boot主启动类的同级或子包下,确保被Spring容器扫描到;必须添加@Configuration(标记为配置类)和@EnableWs(开启SOAP WebService支持)注解。
注意事项
- 日志依赖:Spring Boot默认集成SLF4J,无需额外引入,可直接使用
logger输出日志。 - XML格式化:如果需要更美观的XML日志格式,可给
Transformer设置输出属性(如缩进),或使用第三方工具类简化转换逻辑。 - 请求控制:
handleRequest方法返回false时,会直接终止请求,不会调用后续拦截器和端点方法,可根据业务需求调整。
内容的提问来源于stack exchange,提问作者Maha Sonu
相关产品推荐
相关产品推荐

