MessageContext を顧客の Handler に渡す新しい発信フェーズを (axis2.xml 経由で) セットアップできることがわかりました。次に、MessageContext 経由で SOAPEnvelope/Header を取得し、要素とノードをトラバースし、要素 ( s) 削除したいので、removeChild を呼び出します。
発信 (OutFlow) Axis2 メッセージの場合、WSS(4J) 署名は「セキュリティ」フェーズで行われるようです。
<phase name="Security"/>
そこで、セキュリティ フェーズで追加されたいくつかの XML 要素を削除したいと考えました。具体的には、「ec:InclusiveNamespaces」要素です。XML Exclusive Canonicalization によるものと思われ、WSS4J でこの設定を無効にする他の方法を見つけることができませんでした (Axis2/Rampart の再コンパイルを除いて...)
したがって、独自の新しいカスタム OutFlow ハンドラを追加する必要があります。セキュリティ フェーズの後。
<phase name="PostSecurity">
<handler name="MyOutHandler" class="com.yourcompany.YourSoapHandler"/>
</phase>
次に、カスタム ハンドラー クラスを作成します。
package com.yourcompany;
public class YourSoapHandler extends AbstractHandler {
public InvocationResponse invoke(MessageContext ctx) throws AxisFault {
SOAPEnvelope msgEnvelope = ctx.getEnvelope();
SOAPHeader msgHeader = msgEnvelope.getHeader();
Iterator theDescendants = msgHeader.getDescendants(true);
while(theDescendants.hasNext()){
Object o = theDescendants.next();
if(o instanceof org.apache.axiom.om.impl.dom.ElementImpl){
ElementImpl ele = (ElementImpl)o;
String eleNodeName = ele.getNodeName();
if("ds:CanonicalizationMethod".equals(eleNodeName) || "ds:Transform".equals(eleNodeName)){
Node aNode = ele.getElementsByTagName("ec:InclusiveNamespaces").item(0);
if(aNode != null){
ele.removeChild(aNode);
}
}
}
}
return InvocationResponse.CONTINUE;
}
}
更新された Axis2.xml を ConfigurationContext に渡し、それがサービス スタブに渡される限り、問題はありません。
フェーズについて学ぶために私が使用したいくつかのリファレンスを次に示し
ます
。
これが少なくとも1人の他の人に役立つことを願っています= D