Cómo agrego un encabezado SOAP usando Java JAX-WS
soap client in java (3)
Es posible que desee ver los controladores y las cadenas de controladores. Recientemente tuve que agregar una cookie a una llamada de servicio web determinada y así fue como lo hice, simplemente creé un controlador que interceptaba la llamada inicial e inyecté la cookie, también puede manipular los encabezados de llamada con un controlador de pivote
Una solicitud de cliente SOAP típica con JAX-WS podría ser
FooService service = new FooService();
FooPort port = service.getFooPort();
FooPayload payload = new FooPayload();
payload.setHatSize(3);
payload.setAlias("The Hat");
...
port.processRequest(payload);
Esto genera un contenido de solicitud HTTP algo así como
<?xml ... ?>
<S:Envelope xmlns:S="http://...soap-envelope">
<S:Body>
<!-- payload -->
</S:Body>
</S:Envelope>
Al manipular los argumentos a la llamada a port.processRequest () solo puede 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 puedo hacer eso?
Gracias Nuno,
Tan pronto como sepa cómo iniciar sesión correctamente en .com, haré lo correcto con su respuesta.
Mientras tanto, aquí está el código con el que terminé:
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) {
//
}
}
para agregar el encabezado de Soap, si implementa WS en el servidor de aplicaciones web, el Was agregará parte de seguridad en el encabezado, después de que haya configurado según el estándar WS-SECURITY, como la política web, etc. No entiendo por qué agregarse a usted mismo excepto la parte de contenido cifrado, como contraseña encriptada, etc.