CXF WSS4JOutInterceptor在哪个阶段被调用?

CXF WSS4JOutInterceptor在哪个阶段被调用?,cxf,ws-security,Cxf,Ws Security,调用WSS4JOutInterceptor的阶段是什么? 我需要对自定义拦截器中的头进行一些更改。 但是,由于要对头进行加密和签名,我需要在调用WSS4JOutInterceptor之前进行更改 我在我的自定义拦截器中指定它需要添加到WSS4J之前: super(Phase.PRE_STREAM); addBefore(WSS4JOutInterceptor.class.getName()); 但这并没有起作用。调用我的拦截器时,标头已签名。 我尝试了读取、预处理流、用户流……在所有情况下,s

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

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

super(Phase.PRE_STREAM);
addBefore(WSS4JOutInterceptor.class.getName());
但这并没有起作用。调用我的拦截器时,标头已签名。
我尝试了读取、预处理流、用户流……在所有情况下,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之前到达报头?

如上所示,WSS4JOutInterceptor处于“PRE_协议”阶段。如果您的拦截器处于“PRE_STREAM”中,那么它应该在WSS4JOutInterceptor之前运行。我不知道PRE_流中的SoapMessageInterceptor是如何看到签名的。可能消息已经包含签名?

正如您在上面看到的,WSS4JOutInterceptor处于“PRE_协议”阶段。如果您的拦截器处于“PRE_STREAM”中,那么它应该在WSS4JOutInterceptor之前运行。我不知道PRE_流中的SoapMessageInterceptor是如何看到签名的。也许消息已经包含签名?

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


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

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


但是,这将不起作用,因为WSS4JOutInterceptor正在对来自SAAJ树对象的内容进行签名,而不是对最终的XML字节进行签名。因此,您不能在签名过程之前更改消息头。

不,它还没有包含签名……事实上,如果我注释掉WSS4J,则消息根本没有安全消息头。所以我在这里有点困惑。。。WSS4J如何在SoapMessageInterceptor之前执行?不,它还没有包含签名…事实上,如果我注释掉WSS4J,消息根本没有安全头。所以我在这里有点困惑。。。WSS4J如何在SoapMessageInterceptor之前执行?我有一些类似的问题。我无法在加密之前收到外发邮件。我有一些类似的问题。在加密之前我无法获取传出消息。