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
相关产品推荐
相关产品推荐

