Как добавить заголовок SOAP с помощью Java JAX-WS
Типичный запрос клиента SOAP с использованием JAX-WS может быть
FooService service = new FooService();
FooPort port = service.getFooPort();
FooPayload payload = new FooPayload();
payload.setHatSize(3);
payload.setAlias("The Hat");
...
port.processRequest(payload);
Это генерирует содержимое HTTP-запроса что-то вроде
<?xml ... ?>
<S:Envelope xmlns:S="http://...soap-envelope">
<S:Body>
<!-- payload -->
</S:Body>
</S:Envelope>
Управляя аргументами вызова port.processRequest(), вы можете влиять только на часть "полезной нагрузки". Вы не можете повлиять на внешнюю часть сообщения XML.
Я хочу вставить заголовок SOAP непосредственно перед телом SOAP
<S:Header>
<X:Security xmlns:X="http://...wsssecurity...>
<X:BinarySecurityToken>kjh...897=</X:BinarySecurityToken>
</X:Security>
</S:Header>
Как я могу это сделать?
3 ответа
Спасибо нуно,
Как только я разберусь, как правильно войти в stackru.com, я поступлю правильно с вашим ответом.
А пока вот код, с которым я закончил:
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);
а также
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) {
//
}
}
Возможно, вы захотите взглянуть на обработчики и цепочки обработчиков. Недавно мне пришлось добавить cookie-файл к данному вызову Webservice, и именно так я и сделал, просто создал обработчик, который перехватил первоначальный вызов и ввел cookie, вы также можете манипулировать заголовки вызовов с помощью Pivot Handler
Для добавления заголовка Soap, если вы реализуете WS на сервере веб-приложений, Was добавит часть безопасности в заголовок, после того как вы настроите в соответствии со стандартом WS-SECURITY, таким как веб-политика и т. д. Я не понимаю, зачем это нужно добавить себя, кроме зашифрованной части контента, такой как зашифрованный пароль и т. д.