调用CXF WSS4JOutInterceptor的哪个阶段?

时间:2016-01-13 17:53:45

标签: cxf ws-security

调用WSS4JOutInterceptor的阶段是什么? 我需要对自定义拦截器中的标头进行一些更改。 但是由于标头要加密和签名,我需要在调用WSS4JOutInterceptor之前进行更改。

我在自定义拦截器中指定需要在WSS4J之前添加:

super(Phase.PRE_STREAM);
addBefore(WSS4JOutInterceptor.class.getName());

但那没有做到。调用我的拦截器时,标题已经签名 我试过READ,PRE_STREAM,USER_STREAM ......在所有情况下,soap信封都是空的,或者标题已经加密和签名。

如何定位我的拦截器以在WSS4JOutInterceptor之前调用?

更新: 我看到拦截器的排序如下:

setup [PolicyOutInterceptor]
  pre-logical [MAPAggregatorImpl, HolderOutInterceptor, SwAOutInterceptor, WrapperClassOutInterceptor, SoapHeaderOutFilterInterceptor]
  post-logical [SoapPreProtocolOutInterceptor]
  prepare-send [MessageSenderInterceptor, GZIPOutInterceptor]
  pre-stream [SoapMessageInterceptor, LoggingOutInterceptor, TransformOutInterceptor, AttachmentOutInterceptor, StaxOutInterceptor]
  pre-protocol [WSS4JOutInterceptor, MAPCodec]
  write [SoapOutInterceptor]
  marshal [BareOutInterceptor]
  post-protocol [WSS4JOutInterceptorInternal]
  post-stream [PolicyVerificationOutInterceptor]
  write-ending [SoapOutEndingInterceptor]
  pre-protocol-ending [SAAJOutEndingInterceptor]
  pre-stream-ending [StaxOutEndingInterceptor]
  prepare-send-ending [MessageSenderEndingInterceptor]

我的拦截器(SoapMessageInterceptor)放在WSS4JOutInterceptor之前......但是soap信封已包含签名。 如何在WSS4J之前访问标题?

2 个答案:

答案 0 :(得分:0)

如上所示,WSS4JOutInterceptor处于“PRE_PROTOCOL”阶段。如果你的拦截器在“PRE_STREAM”中,那么它应该在WSS4JOutInterceptor之前运行。我没有看到PRE_STREAM中的SoapMessageInterceptor如何看到Signature。也许该消息已包含签名?

答案 1 :(得分:0)

我将继续猜测您的拦截器将覆盖默认的XMLStreamWriter并直接更改内容。

但是这不起作用,因为WSS4JOutInterceptor正在从SAAJ树对象而不是最终的XML字节签名内容。因此,您无法在签名过程之前更改标题。