如何向SOAPHeader插入SAML声明

问题描述:

NB-6.8 jdk-1.6.14 WSS4j-1.5.8,OpenSAML-2.3.0 我尝试修改WSS4J-1.5.8以运行SAML 2.0,但无法插入所产生的断言到现有SOAP头部,这样的代码:如何向SOAPHeader插入SAML声明

Assertion assertion = createAssertion("some subject", "some issuer"); 

    Document doc = docBuilder.parse("request.xml"); 

    Element parent = doc.getDocumentElement(); 

    Node node = parent.getElementsByTagName("soapenv:Header"); 
    node.appendChild(assertion.getDOM()); 

错误:WRONG_DOCUMENT_ERR:一个节点在不同的文档比创建它的一个使用。

但在wss4j中,一些像insertSecurityHeader这样的函数也是这样做的(appendChild或inserBefore)。他们工作,为什么我的代码错了?我想念的是什么。

+1

在您要查找的所有者文档上认为它的importNode()。 – 2010-03-16 22:21:47

+0

它没有用。我没有看到任何元素被添加到文档,虽然它应该像javadoc说。 – mono 2010-03-17 02:35:07

+0

我最近遇到了类似的问题。在我的情况下,这是因为缺少一些命名空间。 – JST 2010-04-22 16:34:37

实际上,我遇到了使用importNode(NAMESPACE_ERR)的问题,它可以使用adoptNode来解决。

问题是断言的拥有者文档与节点的拥有者文档不同。要解决此问题,节点的所有者文档必须先取得断言的所有权,然后才能追加它。 正如ralph指出的那样,您可以使用node.getOwnerDocument().adoptNode(assertion)来解决该问题。