2009-05-06 5 views
22

Типичный клиент SOAP Java JAX-WS с использованием JAX-WS может бытьКак добавить SOAP-заголовок с помощью запроса

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 Body

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

Как я могу это сделать?

+0

Описывает ли WSDL заголовки? Если да, то не JAX-WS генерирует код для их добавления? –

ответ

1

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

18

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

так же, как только я работаю, как войти в правильно 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) { 
     // 
    } 
} 
+0

Я принимаю те же самые точные шаги, что и вы, но я получаю следующее исключение: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: Была сделана попытка вставить узел, где он не разрешен. Вы столкнулись с этой проблемой? Приложение работает на weblogic 10.1 – Vladimir

0

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

Смежные вопросы