调用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之前访问标题?
答案 0 :(得分:0)
如上所示,WSS4JOutInterceptor处于“PRE_PROTOCOL”阶段。如果你的拦截器在“PRE_STREAM”中,那么它应该在WSS4JOutInterceptor之前运行。我没有看到PRE_STREAM中的SoapMessageInterceptor如何看到Signature。也许该消息已包含签名?
答案 1 :(得分:0)
我将继续猜测您的拦截器将覆盖默认的XMLStreamWriter并直接更改内容。
但是这不起作用,因为WSS4JOutInterceptor正在从SAAJ树对象而不是最终的XML字节签名内容。因此,您无法在签名过程之前更改标题。