Как добавить заголовок SOAP с помощью Java JAX-WS - PullRequest
23 голосов
/ 06 мая 2009

Типичный запрос клиента 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 ]

18 голосов
/ 07 мая 2009

спасибо нуно,

Как только я разберусь, как правильно войти в stackoverflow.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) {
        //
    }
}
1 голос
/ 06 мая 2009

Вы можете захотеть взглянуть на обработчики и цепочки обработчиков. Недавно мне пришлось добавить cookie-файл к данному вызову Webservice, и именно так я и сделал, просто создал обработчик, который перехватил первоначальный вызов и ввел cookie, также может манипулировать заголовками вызовов с помощью Pivot Handler

0 голосов
/ 25 августа 2013

для добавления заголовка Soap, если вы реализуете WS на сервере веб-приложений, Was добавит часть безопасности в заголовок после того, как вы настроите в соответствии со стандартом WS-SECURITY, таким как веб-политика и т. Д. Я не понять, зачем нужно добавлять себя, кроме зашифрованной части контента, такой как зашифрованный пароль и т. д.

...