![](/img/trans.png)
[英]How to get Soap Header Information by CXF WSDL2JAVA Generated Code?
[英]Adding soap header authentication to wsdl2java generated code
我正在從wsdl創建Java Web服務客戶端。 我使用Eclipses的Dynamic Web Project和新的Web Services Client通過wsdl2java和Apache Axis 1.4生成代碼。 我需要在此代碼中添加SOAP身份驗證才能使其與服務一起使用。 我在生成的代碼中找不到這樣做的地方。 經過大量研究,我發現了這一點,到目前為止,我已經將其用作代碼的基礎。
在我得到“處理郵件安全性時發生錯誤”或類似內容之前。 現在我得到
“異常:不理解“必須理解”標頭:{ 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.