2016-09-22 17 views
0

我一直在嘗試使用Apache Axis編寫webservice客戶端Intellij想法13並且有一些困難。我已經可以將那個webservice與.net c#項目連接起來,現在我需要用java來實現。 WebService希望在安全性標題內使用用戶名和密碼。WebService客戶端使用帶有WS-Security的Apache Axis。沒有用戶名安全令牌找到

這裏是WebService的響應:

嵌套錯誤:沒有用戶名安全令牌與演員的WS塊中發現:目前演員

這裏是我使用的代碼。

SomeWebServiceServiceLocator locator = new SomeWebServiceServiceLocator(); 
SomeWebServicePortBindingStub stub = (SomeWebServicePortBindingStub) locator.getSomeWebServicePort(); 
stub.setUsername("usr111"); 
stub.setPassword("pass111"); 

SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); 
javax.xml.soap.SOAPPart sOAPPart = soapMessage.getSOAPPart(); 
SOAPEnvelope envelope = sOAPPart.getEnvelope(); 
SOAPHeader header = envelope.getHeader(); 

if (header == null) { 
      System.out.println("no header yet, create one"); 
      header = envelope.addHeader(); 
     } 
     SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 

     Name tUserTokenElementName = envelope.createName("UsernameToken", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
     SOAPElement tUserTokenElement = security.addChildElement(tUserTokenElementName); 
     tUserTokenElement.removeNamespaceDeclaration("wsse"); 
     tUserTokenElement.addNamespaceDeclaration("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); 
     // 
     tUserTokenElement.addAttribute(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Id", "u"), "UsernameToken-usr111"); 

     // user name child 
     Name tUsernameElementName = envelope.createName("Username", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
     SOAPElement tUsernameElement = tUserTokenElement.addChildElement(tUsernameElementName); 
     tUsernameElement.removeNamespaceDeclaration("wsse"); 
     tUsernameElement.addTextNode("usr111"); 

     // password child 
     Name tPasswordElementName = envelope.createName("Password", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
     SOAPElement tPasswordElement = tUserTokenElement.addChildElement(tPasswordElementName); 
     tPasswordElement.removeNamespaceDeclaration("wsse"); 
     tPasswordElement.addTextNode("pass111"); 
     tPasswordElement.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 

     Element assertion = (Element) security; 
     SOAPHeaderElement header0 = new SOAPHeaderElement(assertion); 
     stub.setHeader(header0); 

該代碼生成以下標題。

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:actor="" soapenv:mustUnderstand="0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<wsse:UsernameToken wsu:Id="UsernameToken-usr111" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <wsse:Username>usr111</wsse:Username> 
    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pass111</wsse:Password> 
</wsse:UsernameToken> </wsse:Security> 

我也跟蹤工作.net cs應用程序與Fiddler的連接,但未能跟蹤我的Java調用。這是工作請求的標題。

<s:Header> 
    <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo1zQ7/YYhJpArMKDUdofV4QAAAAAvGLoItf+KkC8k4KQjqtXUK0D00UQcXJBtCFGkgP0qBkACQAA</VsDebuggerCausalityData> 
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <o:UsernameToken u:Id="uuid-de9cefc3-6ab9-407f-8658-7ecf007559bc-17"> 
      <o:Username>usr111</o:Username> 
      <o:Password o:Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pass111</o:Password> 
     </o:UsernameToken> 
    </o:Security> 
</s:Header> 

而且,這裏是從webservice所有者

<soapenv:Header> 
    <wsse:Security soapenv:mustUnderstand="0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
    <wsse:UsernameToken wsu:Id="UsernameToken-11111111" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsse:Username>someuser</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">*****</wsse:Password> 
    </wsse:UsernameToken> 
    </wsse:Security> 

也有通過Web服務的業主提供了兩個.CRT證書提供了一個例子xml。我將它們添加到javakeystore中,但它沒有任何幫助。 最後,我不能用SoapUI請求webservice

+0

難道是'WSU:ID爲「usr111」'什麼,而不是你把?它必須匹配我試過的實際用戶名 – ACV

+0

,但得到相同的錯誤。 –

回答

3

好的,如果其他人面臨這種​​錯誤,下面的這個方法對我有用。 我不記得我在哪裏找到這個,但感謝店主。 。感謝him

void addWsSecurityHeader(org.apache.axis.client.Stub binding, String wsUser,String wsPass)throws SOAPException { 

    // Create the top-level WS-Security SOAP header XML name. 
    QName headerName = new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security"); 
    SOAPHeaderElement header = new SOAPHeaderElement(headerName); 
    // no intermediate actors are involved. 
    header.setActor(null); 
    // not important, "wsse" is standard 
    header.setPrefix("wsse"); 
    header.setMustUnderstand(true); 

    // Add the UsernameToken element to the WS-Security header 
    SOAPElement utElem = header.addChildElement("UsernameToken"); 
    SOAPElement userNameElem = utElem.addChildElement("Username"); 
    userNameElem.removeContents(); 
    userNameElem.setValue(wsUser); 

    SOAPElement passwordElem = utElem.addChildElement("Password"); 
    passwordElem.setValue(wsPass); 
    // Finally, attach the header to the binding. 
    binding.setHeader(header); 
} 

也爲跟蹤我的發送和收到我用this

相關問題