我在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()
我尝试了一个小测试,它对我的工作方式相同。