我在Spring WS上有一个Web服务,带有两个端点拦截器。 XML配置如下所示

<sws:interceptors>
    <bean class="org.someorg.security.SignatureInterceptor"/>
    <bean class="org.someorg.common.LoggingInterceptor">
        <constructor-arg value="logger_1"/>
    </bean>
</sws:interceptors>


SignatureInterceptor验证传入的SOAP信封的签名并签署传出的SOAP信封。

LoggingInterceptor将原始SOAP数据(字节数组)存储在数据库中。

我需要SignatureInterceptor在LoggingInterceptor之前调用,并以这种方式编写拦截器bean,我希望它可以解决我的问题。但是根据日志消息LoggingInterceptor首先调用,因此未签名的数据存储在数据库中。

然后我更改了配置,只是交换了bean声明,它们开始按预期工作

<sws:interceptors>
    <bean class="org.someorg.common.LoggingInterceptor">
        <constructor-arg value="logger_1"/>
    </bean>
    <bean class="org.someorg.security.SignatureInterceptor"/>
</sws:interceptors>


但是我不清楚这种情况。如何显式设置拦截器的调用顺序?

最佳答案

该顺序应该是您指定的方式(除非它们被映射到特定的端点url,在这种情况下,它们将最后处理)-请注意,处理handleResponse的顺序与handlRequest相反--

理想情况下,您应该看到:


SignatureInterceptor.handleRequest(..)
LoggingInterceptor.handleRequest(..)
端点处理请求
LoggingInterceptor.handleResponse()
SignatureInterceptor.handleResponse()


我尝试了一个小测试,它对我的​​工作方式相同。

07-24 09:15