Доступ к заголовкам безопасности в пользовательском обработчике JAX-WS - PullRequest
3 голосов
/ 08 июня 2011

Я хочу реализовать пользовательский обработчик, который будет проверять, содержит ли запрос все необходимые заголовки безопасности.

«Головная» часть запроса выглядит следующим образом:

<soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <header1>value of header one</header1>
    <header2>value of header two</header2>

    <wsse:Security soap:mustUnderstand="1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">    
        <wsse:UsernameToken>    
            <wsse:Username>X</wsse:Username>    
            <wsse:Password>X</wsse:Password>    
        </wsse:UsernameToken>    
    </wsse:Security>    
</soapenv:Header>

Я пытался получить доступ к заголовку безопасности, но не могу.

Первый способ, который я попробовал, был:

public class MyCustomHandler implements 
SOAPHandler<SOAPMessageContext> {

  public boolean handleMessage(SOAPMessageContext smc) {
      SOAPMessage message = smc.getMessage();
      SOAPHeader header = message.getSOAPHeader();
      Iterator iterator = header.getChildElements();
      while (iterator.hasNext()) {
        SOAPElement element = (SOAPElement) iterator.next();
        log.debug(element.getValue());
        log.debug(element.getLocalName());

      }
      return true;
  }

  public boolean handleFault(SOAPMessageContext smc) {
      logToSystemOut(smc);
      return true;
  }

  public void close(MessageContext messageContext) {
  }

...

К сожалению, цикл «while» регистрирует только header1 и header2, но в «Seciurity» ничего нет.

Я пробовал также getChilds (Qname), но он также не работает.

1 Ответ

0 голосов
/ 29 июля 2013

Вы можете попробовать использовать SOAPPart сообщения:

if (!((Boolean) messageContext.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue()) {
   SOAPPart msg = messageContext.getMessage().getSOAPPart();
   XPathFactory xPathFactory = XPathFactory.newInstance();
   XPath xPath = xPathFactory.newXPath();
   final Map<String, String> namespaceMap = new HashMap<String, String>();
   namespaceMap.put("soap", "http://schemas.xmlsoap.org/soap/envelope/");
   namespaceMap.put("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
   NamespaceContext nsContext = new NamespaceContext() {

     @Override
     public Iterator<String> getPrefixes(String namespaceURI) {
       List<String> prefixes = new ArrayList<String>();
       for (String url : namespaceMap.values()) {
         if (url.equals(namespaceURI)) {
           prefixes.add(url);
         }
       }
       return prefixes.iterator();
     }

     @Override
     public String getPrefix(String namespaceURI) {
       return getPrefixes(namespaceURI).next();
     }

     @Override
     public String getNamespaceURI(String prefix) {
        return namespaceMap.get(prefix);
     }
   };
   xPath.setNamespaceContext(nsContext);

   String userName = (String) xPath.evaluate("/soap:Envelope/soap:Header/wsse:Security/wsse:UsernameToken/wsse:Username/text()", msg,
           XPathConstants.STRING);
   String password = (String) xPath.evaluate("/soap:Envelope/soap:Header/wsse:Security/wsse:UsernameToken/wsse:Password/text()", msg,
           XPathConstants.STRING);
}

Я также добавил проверку «только входящих» сообщений. Вы не хотите проверять безопасность в ответах, которые я принимаю.

Это работает для вас (я только что напечатал это. Не проверял ли это на самом деле, чтобы у вас могли возникнуть проблемы с компиляцией)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...