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

时间:2014-02-17 19:53:46

标签: java soap wsdl2java soapheader usernametoken

我正在从wsdl创建Java Web服务客户端。我使用Eclipses的Dynamic Web Project和新的Web Services Client来生成带有Apache Axis 1.4的wsdl2java的代码。我需要为此代码添加SOAP身份验证,以便它与服务一起使用。我在生成的代码中找不到这样做的地方。经过大量的研究,我发现了这个,到目前为止,我已经将其用作我的代码的主干。

Adding ws-security to wsdl2java generated classes

在我收到“处理邮件安全性时出错”或其他内容之前。现在我正在

“例外:未理解”MustUnderstand“标题:{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}安全消息:null”

我尝试了很多事情来克服这个异常。这是我现在的代码。

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头认证的方法,我也会采取这种方式。只需要这个工作,你会认为这样的事情会更简单一点,或者至少有更多的例子。

更新 - 确认使用SOAPUI传递的相同头文件正常工作。必须是框架的东西?我创建了一个自定义处理程序来处理SOAP消息,但这没有帮助。 Axis 1.4和JAX-RPC是问题吗? (我知道他们已经过时但仍然......)

1 个答案:

答案 0 :(得分:4)

冷却。我决定只使用Apache CXF作为我的框架,使用它就像添加

一样简单
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课程。