从soap头中删除mustUnderstand属性



如何从axis客户端soap头中删除mustunderstand属性。即使我没有特别设置它,当我设置soap头信息必须理解和actor属性自动添加到soap消息。有人知道怎么去掉吗?我使用Axis2 1.4版本的wsdl2java来创建我的ws客户机。

这些方法都不适合我,因为:

  • 我正在使用Axis(不是Axis2)
  • 我根本不希望指定属性,因为我的服务器对等方不支持它("'http://schemas.xmlsoap.org/soap/envelope/:mustUnderstand'属性未声明"是这种情况下的典型答案)。

查看"将ws-security添加到wsdl2java生成的类"的答案帮助我编写了一个适合我的解决方案:

void addSecurityHeader(Stub stub, final String username, final String password) {
  QName headerName = new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");  // Or any other namespace that fits in your case
  AtomicReference<SOAPHeaderElement> header 
    = new AtomicReference<SOAPHeaderElement>
        (new SOAPHeaderElement(headerName) {                       
           {  
             SOAPElement utElem = addChildElement("UsernameToken");
             utElem.addChildElement("Username").setValue(username);
             utElem.addChildElement("Password").setValue(password);
           }
           @Override
           public void setAttribute(String namespace, String localName, String value) {
             if (!Constants.ATTR_MUST_UNDERSTAND.equals(localName)) {  // Or any other attribute name you'd want to avoid
               super.setAttribute(namespace, localName, value);
             }
           }
        });
  SOAPHeaderElement soapHeaderElement = header.get();
  soapHeaderElement.setActor(null);      // No intermediate actors are involved.
  stub.setHeader(soapHeaderElement);  // Finally, attach the header to the stub
}

如果您想在AXIS客户机中禁用必须理解的检查在代码中添加以下行:

_call.setProperty(Call.CHECK_MUST_UNDERSTAND, new Boolean(false));

则永远不会调用AXIS客户端的 must理解检查器

在我的情况下,它工作手动删除属性从SOAPHeader

SOAPHeader header = env.getHeader();
OMChildrenQNameIterator childrenWithName = (OMChildrenQNameIterator) header.getChildrenWithName(omElementauthentication.getQName());
    while (childrenWithName.hasNext()) {
        org.apache.axiom.om.OMElement omElement = (org.apache.axiom.om.OMElement) childrenWithName.next();
        QName mustAnderstandQName = omElement.resolveQName("soapenv:mustUnderstand");
        if (mustAnderstandQName == null) {
            continue;
        }
        OMAttribute mustAnderstandAttribute = omElement.getAttribute(mustAnderstandQName);
            if (mustAnderstandAttribute == null) {
                continue;
            }
        omElement.removeAttribute(mustAnderstandAttribute);
    }

我最近遇到了类似的情况,通过谷歌搜索,我设法找到了以下解决方案:

如果使用了Axis2,您可能已经生成了一个MyWSStub文件,其中包含对您的服务的调用。创建一个包装器类(最好不要触及自动生成的存根文件)来扩展您的存根,例如MyWSStubWrapper:
public class MyWSStubWrapper extends MyWSStub {
/**
 * @throws AxisFault
 */
public MyWSStubWrapper() throws AxisFault {
}
/**
 * @param configurationContext
 * @throws AxisFault
 */
public MyWSStubWrapper(ConfigurationContext configurationContext) throws AxisFault {
    super(configurationContext);
}
/**
 * @param targetEndpoint
 * @throws AxisFault
 */
public MyWSStubWrapper(String targetEndpoint) throws AxisFault {
    super(targetEndpoint);
}
/**
 * @param configurationContext
 * @param targetEndpoint
 * @throws AxisFault
 */
public MyWSStubWrapper(ConfigurationContext configurationContext, String targetEndpoint) throws AxisFault {
    super(configurationContext, targetEndpoint);
}
/**
 * @param configurationContext
 * @param targetEndpoint
 * @param useSeparateListener
 * @throws AxisFault
 */
public MyWSStubWrapper(ConfigurationContext configurationContext, String targetEndpoint, boolean useSeparateListener) throws AxisFault {
    super(configurationContext, targetEndpoint, useSeparateListener);
}
@Override
protected void addHeader(OMElement omElementToadd, SOAPEnvelope envelop, boolean mustUnderstand) {
    SOAPHeaderBlock soapHeaderBlock = envelop.getHeader().addHeaderBlock(omElementToadd.getLocalName(), omElementToadd.getNamespace());
    OMNode omNode = null;
    // add child elements
    for (Iterator iter = omElementToadd.getChildren(); iter.hasNext();) {
        omNode = (OMNode) iter.next();
        iter.remove();
        soapHeaderBlock.addChild(omNode);
    }
    OMAttribute omatribute = null;
    // add attributes
    for (Iterator iter = omElementToadd.getAllAttributes(); iter.hasNext();) {
        omatribute = (OMAttribute) iter.next();
        soapHeaderBlock.addAttribute(omatribute);
    }
}

}

请记住,上面的代码将完全删除soapenv:mustUnderstand="0|1"从你的头,如果你想添加你需要调用soapHeaderBlock.setMustUnderstand(true|false);

1)您是否使用Axis SOAPHeaderElement,如果是,您是否将mustUnderstand setter设置为false?

2)由于您正在使用wsdl2java生成客户机,因此WSDL(或者更准确地说,模式)很可能在SOAP绑定中引用的元素上包含mustUnderstand属性。因此,当wsdlToJava生成客户机代码时,自然会添加这些属性。请参阅此处了解mustUnderstand属性的描述。如果修改WSDL是不可能的,并且您必须从头中删除此属性,那么我认为您可以尝试使用处理程序

来完成此操作。

3)不建议,但如果你真的必须删除这个属性,那么我想你可以添加一个客户端处理程序来改变头:http://ws.apache.org/axis/java/apiDocs/org/apache/axis/handlers/package-summary.html

我正在使用axis 1.4客户端与ws安全

在我的情况下,正如Reinhard所说这工作

MyService service = new MyServiceLocator(); 
MyServicePortType port = service.getMyServiceHttpsSoap11Endpoint();
((Stub) port)._setProperty(Call.CHECK_MUST_UNDERSTAND, Boolean.FALSE);

最新更新