2009-05-06 13 views
22

Typowym klienta SOAP za pomocą JAX-WS może byćJak dodać nagłówek SOAP przy użyciu Java JAX-WS wniosek

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

To generuje coś treści żądania HTTP jak

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

Manipulując argumenty wywołania port.processRequest() można wpływać tylko na część "ładunek". Nie można wpływać na zewnętrzną część komunikatu XML.

chcę wstawić nagłówek SOAP tuż przed MYDŁO Ciało

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

Jak mam to zrobić?

+0

Czy WSDL opisuje nagłówki? Jeśli tak, to czy JAX-WS nie wygeneruje kodu, aby je dodać? –

Odpowiedz

1

możesz chcieć przyjrzeć się handlerom i łańcuchom handlerów. - Niedawno musiałem dodać ciasteczko do danego połączenia Webservice i tak to zrobiłem, właśnie utworzyłem handler'a, który przechwycił pierwsze połączenie i wstrzyknął cookie, można również manipulować nagłówki połączeń z Pivot Handler

18

Dzięki Nuno,

Podobnie jak tylko dowiedzieć się, jak zalogować się odpowiednio do stackoverflow.com zrobię słusznie z odpowiedzi.

Tymczasem Oto kod I skończył z:

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); 

i

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

Podejmuję te same kroki co ty, ale otrzymuję następujący wyjątek: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: Podjęto próbę wstawienia węzła, w którym jest on niedozwolony. Czy napotkasz ten problem? Aplikacja działa na weblogic 10.1 – Vladimir

0

dla nagłówka add mydło, jeśli wdrożyć WS na serwerze aplikacji sieci Web, była wola dodaj część bezpieczeństwa w nagłówku, po skonfigurowaniu zgodnie ze standardem WS-SECURITY, takim jak zasady sieciowe itp. Nie rozumiem, dlaczego trzeba dodać siebie z wyjątkiem części zaszyfrowanej, takiej jak zaszyfrowane hasło itp.