【问题标题】:adding security details to soap header in spring client在spring客户端中向soap头添加安全细节
【发布时间】:2014-12-20 20:42:28
【问题描述】:

我正在尝试使用 Spring WS 模板作为客户端来使用 SOAP(外部系统)Web 服务。

我需要将标头信息(安全详细信息)作为标头与肥皂消息一起传递。

我尝试使用 java xml SOAPMessage(javax.xml.soap.SoapMessage) 将该信息添加到 Header 中,并尝试将其转换为 spring SOAPMessage(org.springframework.ws.soap. SoapMessage) 稍后添加标题详细信息。

但它无法转换它,因为它们都不在层次结构中,所以得到类转换异常。

请帮助我了解如何在 spring soap 消息中传递标头信息的安全详细信息

我的代码如下

   public void doWithMessage(WebServiceMessage message) throws IOException,
                                    TransformerException

    SaajSoapMessage saajSoapMessage =(SaajSoapMessage)message;      
    SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
    SOAPPart soapPart = soapMessage.getSOAPPart();
    SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
    SOAPHeader soapHeader = soapEnvelope.getHeader();
    Name headerElementName = soapEnvelope.createName("Security","wsse","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

    // Add "Security" soapHeaderElement to soapHeader
    SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(headerElementName);

    // This may be important for some portals!
    soapHeaderElement.setActor(null);

    // Add usernameToken to "Security" soapHeaderElement 
    SOAPElement usernameTokenSOAPElement = soapHeaderElement.addChildElement("UsernameToken");

    // Add username to usernameToken
    SOAPElement userNameSOAPElement = usernameTokenSOAPElement.addChildElement("Username");
    userNameSOAPElement.addTextNode("myUserName");          
    // Add password to usernameToken
    SOAPElement passwordSOAPElement = usernameTokenSOAPElement.addChildElement("Password");

    passwordSOAPElement.addTextNode("myPassword");
    ((SoapMessage) soapMessage).setSoapAction("GetMetaDataLookUpRequestType");//exception while casting
}

我的请求xml如下

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://emc.com/it/enterprise/contract/CMCContractLookupService/v1" xmlns:v11="http://emc.com/it/enterprise/data/v1">
   <soapenv:Header>
   <wsse:Security soapenv:mustUnderstand="1"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

         <wsse:UsernameToken wsu:Id="UsernameToken-20">
            <wsse:Username>xxxx</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxxx</wsse:Password>

          </wsse:UsernameToken>
      </wsse:Security>
   </soapenv:Header>
   <soapenv:Body>

      <v1:GetContractMetaDataLookUpRequest>
         <v11:GetMetaDataLookUpRequestDocument>
            <v11:ContractID>123456</v11:ContractID>
             <v11:BadgeID>1</v11:BadgeID>

         </v11:GetMetaDataLookUpRequestDocument>
      </v1:GetContractMetaDataLookUpRequest>
   </soapenv:Body>
</soapenv:Envelope>

我需要帮助,主要是如何将标头信息(如上面的 xml 请求中所示)添加到soap标头消息中。

非常感谢您的帮助。谢谢。

【问题讨论】:

    标签: web-services soap spring-ws


    【解决方案1】:

    这应该是saajSoapMessage.setSoapAction("GetMetaDataLookUpRequestType") 而不是((SoapMessage)soapMessage).setSoapAction("GetMetaDataLookUpRequestType")。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      相关资源
      最近更新 更多