SOAP Web服务的通用拦截器/处理程序

时间:2014-02-11 03:37:46

标签: web-services rest soap cxf interceptor

如果您使用的是RESTful Webservices,我们可以使用一个过滤器,它可以根据模式过滤任何请求并过滤任何RESTful请求。但是,如果我们使用SOAP Web服务,我们就不能使用该过滤器从SOAP请求中获取任何信息,因为SOAP请求是作为有效负载发送的,并且只能读取一次。

我们有什么方法可以在JAX-WS中声明CXF或Handler中的拦截器,它可以拦截所有SOAP请求或基于正则表达式来拦截*等等。

要求是基本上从每个SOAP请求的头部获取授权令牌,并将其设置为线程上下文以供将来使用。上面提到的方式看起来是唯一的解决方案,因为我们不想手动为每个服务添加一个拦截器。

另一种解决方案是将授权令牌添加到httpheader并使用过滤器收集它。我们有什么方法可以将http标头添加到soap有效负载中吗?

请提供解决方案或建议。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用拦截器来访问消息

public class CustomInterceptor extends AbstractSoapInterceptor<SOAPMessage> {


    public CustomInterceptor() {
        super(Phase.RECEIVE);
    }

    @Override
    public void handleMessage(SOAPMessage message) throws Fault {


        //Use header to access the element, as I believe generally header is used carry authorization details 
        message.getSOAPHeader();

        //Can be used to access body information
        message.getSOAPBody();      

    }

}

您可以添加配置文件,如下所示

<jaxws:endpoint>

    <jaxws:inInterceptors>
           <ref bean="custInterceptor"/>
        </jaxws:inInterceptors>

</jaxws:endpoint>

<bean id="custInterceptor" class="com.kp.CustomInterceptor">

答案 1 :(得分:0)

要将拦截器附加到所有端点,请使用cxf:bus

   <cxf:bus>
        <cxf:inInterceptors>
            <ref bean="inWsMessageInterceptor"/>
        </cxf:inInterceptors>
        <cxf:outInterceptors>
            <ref bean="outWsMessageInterceptor"/>
        </cxf:outInterceptors>
        <cxf:outFaultInterceptors>
            <ref bean="outWsMessageInterceptor"/>
        </cxf:outFaultInterceptors>
    </cxf:bus>