You need to enable JavaScript to run this app. Spring中SOAP拦截器如何获取HttpServletRequest与HttpServletResponse
优惠活动
大模型
产品
解决方案
定价
更多

Spring中SOAP拦截器如何获取HttpServletRequest与HttpServletResponse

Spring Boot SOAP EndpointInterceptor获取HttpServletRequest/HttpServletResponse解决方案

问题1方案说明

WebMvcConfigurerAdapter + HandlerInterceptor 属于Spring MVC的拦截体系,仅对@Controller注解的HTTP接口生效。@Endpoint注解的SOAP服务由Spring Web Services(Spring-WS)模块独立处理,走单独的请求链路,不会触发MVC层拦截器,该类方案不适用当前场景。

问题2方案(从MessageContext直接获取)

无需额外配置,直接在handleRequest/handleResponse等重写方法中,通过MessageContext内置属性或者传输上下文即可提取两个对象,两种可选实现方式如下:

实现代码示例

import org.springframework.ws.context.MessageContext;
import org.springframework.ws.server.EndpointInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
    LOG.info("Endpoint Request Handling");

    // 方式1:直接读取MessageContext内置的Servlet属性(写法更简单)
    HttpServletRequest request = (HttpServletRequest) messageContext.getProperty(MessageContext.SERVLET_REQUEST);
    HttpServletResponse response = (HttpServletResponse) messageContext.getProperty(MessageContext.SERVLET_RESPONSE);

    /*
    // 方式2:从传输上下文获取(适合需要操作更底层传输对象的场景)
    import org.springframework.ws.transport.context.TransportContext;
    import org.springframework.ws.transport.context.TransportContextHolder;
    import org.springframework.ws.transport.http.HttpServletConnection;
    TransportContext transportContext = TransportContextHolder.getTransportContext();
    HttpServletConnection connection = (HttpServletConnection) transportContext.getConnection();
    HttpServletRequest request = connection.getHttpServletRequest();
    HttpServletResponse response = connection.getHttpServletResponse();
    */

    // 拿到对象后可正常调用原生Servlet方法,例如获取请求头、客户端IP、设置响应头等
    String clientIp = request.getRemoteAddr();
    String authHeader = request.getHeader("Authorization");
    response.setHeader("Custom-Resp-Header", "test");

    return true;
}

注意事项

  • 以上两种方式仅适用于标准Servlet容器部署的场景(Spring Boot内置Tomcat/Jetty/Undertow均符合要求),如果是非Servlet环境部署需要提前做instanceof类型校验避免转换异常。
  • 两种方式获取的对象是同一个,可根据自己的使用场景自由选择。

内容的提问来源于stack exchange,提问作者Shanij P.S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 05:15:01