簡體   English   中英

向wsdl2java生成的代碼添加soap標頭身份驗證

[英]Adding soap header authentication to wsdl2java generated code

我正在從wsdl創建Java Web服務客戶端。 我使用Eclipses的Dynamic Web Project和新的Web Services Client通過wsdl2java和Apache Axis 1.4生成代碼。 我需要在此代碼中添加SOAP身份驗證才能使其與服務一起使用。 我在生成的代碼中找不到這樣做的地方。 經過大量研究,我發現了這一點,到目前為止,我已經將其用作代碼的基礎。

將ws-security添加到wsdl2java生成的類

在我得到“處理郵件安全性時發生錯誤”或類似內容之前。 現在我得到

“異常:不理解“必須理解”標頭:{ 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標頭身份驗證的方法,我也會這樣做。 僅僅需要它起作用,您就會認為類似這樣的事情會更直接一些,或者至少會有更多的示例。

更新-確認使用SOAPUI傳遞的相同標頭可以正常工作。 必須與框架有關? 我創建了一個自定義處理程序來處理SOAP消息,但這沒有幫助。 Axis 1.4和JAX-RPC是問題嗎? (我知道他們已經過時了,但仍然...)

涼。 我決定只使用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的經驗教訓。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM