2011-05-12 26 views
13

tengo un servicio web NO-.net de Oracle Para acceder necesito agregar el encabezado soap. ¿Cómo puedo agregar el encabezado soap en java?Cómo agregar el encabezado soap en java

Authenticator.setDefault(new ProxyAuthenticator("username", "password")); 
       System.getProperties().put("proxySet", "true"); 
       System.setProperty("http.proxyHost", "IP"); 
       System.setProperty("http.proxyPort", "port"); 




       proxy = new RegPresMed_Service(new URL("webservice")).getRegPresMed(); 
       ((BindingProvider) proxy).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "realwebservice"); 
       ((BindingProvider) proxy).getRequestContext().put("com.sun.xml.ws.request.timeout", new Integer(60000)); 
       ((BindingProvider) proxy).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "webserviceUsername"); 
       ((BindingProvider) proxy).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "webservicePassword"); 

¿es esto necesario?

((BindingProvider) proxy).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "webserviceUsername"); 
        ((BindingProvider) proxy).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "webservicePassword"); 

mi cabecera jabón es así:

<wsse:Security soapenv:mustUnderstand="1" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
    <wsse:UsernameToken wsu:Id="UsernameToken-6" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsse:Username>username</wsse:Username> 
     <wsse:Password 
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password> 
     <wsse:Nonce 
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">randomnaumber==</wsse:Nonce> 
     <wsu:Created>dateCreated</wsu:Created> 
    </wsse:UsernameToken> 
</wsse:Security> 

Respuesta

18
+1

Enlace de interés. Gracias. – Abdul

+0

Hola, he usado esta muestra también pero obtengo un error al agregar la siguiente línea: usernameToken.addAttribute (QName.valueOf ("xmlns: wsu"), urlUtility) ;, este es el error org.w3c.dom.DOMException : NAMESPACE_ERR: se intenta crear o cambiar un objeto de forma incorrecta con respecto a los espacios de nombres. He intentado cualquier cosa en cuanto a mi habilidad, por favor, necesito ayuda. – Alex

+0

El enlace está muerto ahora. Reemplazos? – MeIr

2

que estaba enfrentando el mismo problema y lo resolvió mediante la eliminación de los xmlns: atributo WSU .Trate de no agregarlo en el usernameToken.Hope. Esto también resuelve tu problema.

3

Luché para que esto funcionara. Es por eso que voy a añadir una solución completa aquí:

Mi objetivo es añadir esta cabecera a la envoltura SOAP:

<soapenv:Header> 
     <urn:OTAuthentication> 
     <urn:AuthenticationToken>TOKEN</urn:AuthenticationToken> 
     </urn:OTAuthentication> 
    </soapenv:Header> 
  1. En primer lugar crear una clase SOAPHeaderHandler.

    import java.util.Set; 
    import java.util.TreeSet; 
    
    import javax.xml.namespace.QName; 
    import javax.xml.soap.SOAPElement; 
    import javax.xml.soap.SOAPEnvelope; 
    import javax.xml.soap.SOAPFactory; 
    import javax.xml.soap.SOAPHeader; 
    import javax.xml.ws.handler.MessageContext; 
    import javax.xml.ws.handler.soap.SOAPHandler; 
    import javax.xml.ws.handler.soap.SOAPMessageContext; 
    
    public class SOAPHeaderHandler implements SOAPHandler<SOAPMessageContext> { 
    
        private final String authenticatedToken; 
    
        public SOAPHeaderHandler(String authenticatedToken) { 
         this.authenticatedToken = authenticatedToken; 
        } 
    
        public boolean handleMessage(SOAPMessageContext context) { 
         Boolean outboundProperty = 
           (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
         if (outboundProperty.booleanValue()) { 
          try { 
           SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope(); 
           SOAPFactory factory = SOAPFactory.newInstance(); 
           String prefix = "urn"; 
           String uri = "urn:api.ecm.opentext.com"; 
           SOAPElement securityElem = 
             factory.createElement("OTAuthentication", prefix, uri); 
           SOAPElement tokenElem = 
             factory.createElement("AuthenticationToken", prefix, uri); 
           tokenElem.addTextNode(authenticatedToken); 
           securityElem.addChildElement(tokenElem); 
           SOAPHeader header = envelope.addHeader(); 
           header.addChildElement(securityElem); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } else { 
          // inbound 
         } 
         return true; 
        } 
    
        public Set<QName> getHeaders() { 
         return new TreeSet(); 
        } 
    
        public boolean handleFault(SOAPMessageContext context) { 
         return false; 
        } 
    
        public void close(MessageContext context) { 
         // 
        } 
    } 
    
    1. agregar el controlador al proxy. Tenga en cuenta que según la documentación de javax.xml.ws.Binding: "Si se modifica la cadena devuelta, se requiere una llamada a setHandlerChain para configurar la instancia de enlace con la nueva cadena".

    Authentication_Service authentication_Service = new Authentication_Service();

    Authentication basicHttpBindingAuthentication = authentication_Service.getBasicHttpBindingAuthentication(); String authenticatedToken = "TOKEN"; List<Handler> handlerChain = ((BindingProvider)basicHttpBindingAuthentication).getBinding().getHandlerChain(); handlerChain.add(new SOAPHeaderHandler(authenticatedToken)); ((BindingProvider)basicHttpBindingAuthentication).getBinding().setHandlerChain(handlerChain);
+0

Tengo un objetivo muy similar para agregar el token de autenticación al encabezado SOAP para la conexión OT.He seguido el mismo código pero obtengo "SOAPFaultException: se requieren nombre de usuario y contraseña OTDS". excepción a pesar de que he pasado un token autenticado válido. ¿Podrías por favor guiarme a dónde me estoy equivocando? (puedo conectarme con OT en una aplicación java independiente pero no cuando funciono como un servicio web) – Tony

+1

Trate de ver lo que está enviando como el sobre de SOAP. Puedes hacerlo agregando un controlador. Siga la respuesta en esta publicación http://stackoverflow.com/questions/1945618/tracing-xml-request-responses-with-jax-ws – edubriguenti

+0

Al agregar el controlador, el sobre completo de SOAP se imprimirá en el registro, y usted verá lo que está mal. – edubriguenti

0

Maven dependencia

<dependency> 
     <groupId>org.springframework.ws</groupId> 
     <artifactId>spring-ws-security</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.ws.security</groupId> 
     <artifactId>wss4j</artifactId> 
     <version>1.6.19</version> 
    </dependency>  

clase de configuración

import org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor; 

@Configuration 
public class ConfigurationClass{ 

@Bean 
public Wss4jSecurityInterceptor securityInterceptor() { 
    Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor(); 
    wss4jSecurityInterceptor.setSecurementActions("UsernameToken"); 
    wss4jSecurityInterceptor.setSecurementMustUnderstand(true); 
    wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText"); 
    wss4jSecurityInterceptor.setSecurementUsername("123456789011"); 
    wss4jSecurityInterceptor.setSecurementPassword("TestPass123"); 
    return wss4jSecurityInterceptor; 
} 

XML Resultado

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Header> 
    <wsse:Security 
     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" 
     SOAP-ENV:mustUnderstand="1"> 
     <wsse:UsernameToken wsu:Id="UsernameToken-F57F40DC89CD6998E214700450735811"> 
      <wsse:Username>123456789011</wsse:Username> 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TestPass123</wsse:Password> 
     </wsse:UsernameToken> 
    </wsse:Security> 
</SOAP-ENV:Header> 
<SOAP-ENV:Body> 
    ... 
    something 
    ... 
</SOAP-ENV:Body> 

Cuestiones relacionadas