You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:42:38