我发现我可以设置一个新的传出阶段(通过axis2.xml),它将MessageContext传递给我的客户处理程序,然后我可以通过MessageContext获取SOAPEnvelope/Header,遍历元素和节点,找到元素( s) 我要删除,然后调用removeChild。
对于传出(OutFlow)Axis2 消息,WSS(4J) 签名似乎发生在“安全”阶段。
<phase name="Security"/>
所以,我想删除一些在安全阶段附加的 XML 元素。具体来说,“ec:InclusiveNamespaces”元素。它似乎来自 XML Exclusive Canonicalization,我想不出在 WSS4J 中禁用此设置的任何其他方法(除了重新编译 Axis2/Rampart ...)
所以,我们需要添加我们自己的、新的、自定义的 OutFlow Handler。在安全阶段之后。
<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 中,然后将其传递到您的服务存根中,您就可以开始了。
以下是我用于学习阶段的一些参考资料:http:
//www.packtpub.com/article/handler-and-phase-in-apache-axis
http://wso2.com/library/777/
我希望这至少可以帮助另一个人=D