2009-05-06 26 views
22

Un cliente típico de SOAP en Java JAX-WS utilizando JAX-WS podría ser¿Cómo puedo añadir un encabezado de SOAP mediante solicitud

FooService service = new FooService(); 
FooPort port = service.getFooPort(); 
FooPayload payload = new FooPayload(); 
payload.setHatSize(3); 
payload.setAlias("The Hat"); 
... 
port.processRequest(payload); 

Esto genera una solicitud de contenido HTTP algo así como

<?xml ... ?> 
<S:Envelope xmlns:S="http://...soap-envelope"> 
    <S:Body> 
    <!-- payload --> 
    </S:Body> 
</S:Envelope> 

Manipulando los argumentos de la llamada a port.processRequest() solo pueden afectar a la parte de "carga útil". No puede afectar la parte externa del mensaje XML.

quiero insertar un encabezado SOAP justo antes del cuerpo SOAP

<S:Header> 
    <X:Security xmlns:X="http://...wsssecurity...> 
     <X:BinarySecurityToken>kjh...897=</X:BinarySecurityToken> 
    </X:Security> 
</S:Header> 

¿Cómo se hace eso?

+0

¿Describe el WSDL los encabezados? Si es así, ¿JAX-WS no genera el código para agregarlos? –

Respuesta

1

es posible que desee ver las cadenas de manipuladores y manipuladores.- Recientemente tuve que agregar una cookie a una llamada de servicio web determinada y así fue como lo hice, acaba de crear un controlador que interceptó la llamada inicial e inyectó la cookie, también puede manipular las cabeceras de llamada con un pivote Handler

18

Gracias Nuno,

tan pronto como me resuelvo modo de iniciar sesión correctamente a stackoverflow.com voy a hacer lo correcto con su respuesta.

Por el momento aquí está el código que terminó con:

FooService service = new FooService(); 
service.setHandlerResolver(new HandlerResolver() { 
    public List<Handler> getHandlerChain(PortInfo portInfo) { 
     List<Handler> handlerList = new ArrayList<Handler>(); 
     handlerList.add(new RGBSOAPHandler()); 
     return handlerList; 
    } 
}); 
FooPort port = service.getFooPort(); 
FooPayload payload = new FooPayload(); 
payload.setHatSize(3); 
payload.setAlias("The Hat"); 
... 
port.processRequest(payload); 

y

class RGBSOAPHandler implements SOAPHandler<SOAPMessageContext> { 

    public Set<QName> getHeaders() { 
     return new TreeSet(); 
    } 

    public boolean handleMessage(SOAPMessageContext context) { 
     Boolean outboundProperty = 
      (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
     if (outboundProperty.booleanValue()) { 
      SOAPMessage message = context.getMessage(); 
      try { 
       SOAPEnvelope envelope = context.getMessage() 
         .getSOAPPart().getEnvelope(); 
       SOAPFactory factory = SOAPFactory.newInstance(); 
       String prefix = "X"; 
       String uri = "http://...wsssecurity..."; 
       SOAPElement securityElem = 
         factory.createElement("Security",prefix,uri); 
       SOAPElement tokenElem = 
         factory.createElement("BinarySecurityToken",prefix,uri); 
       tokenElem.addTextNode("kjh...897="); 
       securityElem.addChildElement(tokenElem); 
       SOAPHeader header = envelope.addHeader(); 
       header.addChildElement(securityElem); 

      } catch (Exception e) { 
       System.out.println("Exception in handler: " + e); 
      } 
     } else { 
      // inbound 
     } 
     return true; 
    } 

    public boolean handleFault(SOAPMessageContext context) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public void close(MessageContext context) { 
     // 
    } 
} 
+0

Estoy siguiendo exactamente los mismos pasos que yo, pero obtengo la siguiente excepción: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: se ha intentado insertar un nodo donde no está permitido. ¿Has encontrado este problema? La aplicación se está ejecutando en weblogic 10.1 – Vladimir

0

de cabecera de jabón complemento, si se implementa la WS en el servidor de aplicaciones Web, el era la voluntad agregar parte de seguridad en el encabezado, después de haber configurado según WS-SECURITY estándar, como la política web, etc. No entiendo por qué necesita agregarse a usted mismo excepto la parte de contenido cifrado, como contraseña cifrada, etc.

Cuestiones relacionadas