将soap标头身份验证添加到wsdl2java生成的代码中



我正在从wsdl创建Java web服务客户端。我使用Eclipses的动态Web项目和新的Web服务客户端,用ApacheAxis1.4的wsdl2java生成代码。我需要将SOAP身份验证添加到该代码中,以便它与服务一起工作。我在生成的代码中找不到这样做的位置。经过大量的研究,我发现了这一点,到目前为止,我一直将其作为代码的主干。

将ws-security添加到wsdl2java生成的类

在我收到"处理邮件安全性时出错"或类似的信息之前。现在我得到

异常:不理解"MustUnderstand"标头:{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}安全消息:空">

我已经尝试了很多方法来克服这个例外。这是我现在得到的代码。

javax.xml.namespace.QName headerName = new javax.xml.namespace.QName(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement(headerName);
header.setActor(null);
header.setMustUnderstand(true);
// Add the UsernameToken element to the WS-Security header
javax.xml.soap.SOAPElement utElem = header.addChildElement("UsernameToken");
utElem.setAttribute("Id", "uuid-3453f017-d595-4a5b-bc16-da53e5831cd1-1");
javax.xml.soap.SOAPElement userNameElem = utElem.addChildElement("Username");
userNameElem.setValue("username");
javax.xml.soap.SOAPElement passwordElem = utElem.addChildElement("Password");
passwordElem.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
passwordElem.setValue("password");
header.setProcessed(true);
// Finally, attach the header to the binding.
setHeader(header)

此代码位于我的Binding_ServiceStub类中(在其createCall方法中)。

我们已经用这个wsdl在C#和VB中创建了客户端,在那里只需更改ClientCredentials变量就可以了,它是生成的代理类的扩展。我希望这里能有类似的东西。

这也是wsdl代码中的安全策略。

<wsp:Policy><sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"><wsp:Policy><sp:WssUsernameToken10/></wsp:Policy></sp:UsernameToken></wsp:Policy>

有人知道我还能在这里做什么吗?为什么会出现这种异常?我尝试了许多不同的前缀、setProcesses和setMustUnderstand值的组合,但都是徒劳的(基于我对这个异常的研究)。

如果有人知道在wsdl2java代码中添加Soap头身份验证的方法,我也会接受。只需要这样做,你就会认为这样的事情会更简单一点,或者至少有更多的例子。

Update-确认使用SOAPUI传递的相同标头工作正常。一定是框架有问题吗?我创建了一个自定义处理程序来处理SOAP消息,但这并没有帮助。Axis 1.4和JAX-RPC是问题所在吗?(我知道它们已经过时了,但仍然…)

酷。我决定只使用ApacheCXF作为我的框架,使用它就像添加一样简单

javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider) port;
bp.getRequestContext().put("ws-security.username", username);
bp.getRequestContext().put("ws-security.password", password);

哇,好多了。不要使用Axis 1.4的经验教训。

相关内容

  • 没有找到相关文章

最新更新