2011-06-08 2 views
3

要求にすべての必要なセキュリティヘッダが含まれているかどうかをチェックするカスタムハンドラを実装したいとします。JAX-WSカスタムハンドラのセキュリティヘッダへのアクセス

次のようにリクエストの「頭」の部分が見えます:

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

私はseciurityヘッダへのアクセスを取得しようとしましたが、私はできません。私が試した

最初の方法は:

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) { 
    } 

...

UnfortunetalyループのみHEADER1とHEADER2を記録したが、 "Seciurity" については何もない "ながら"。

私もgetChilds(Qname)を試しましたが、動作しません。

答えて

0

あなたがメッセージの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); 
} 

私はまた、「唯一のインバウンド」のメッセージのチェックを追加しました。あなたは私が仮定しているあなたの上のセキュリティのものをチェックしたくありません。

これはあなたのために働きますか(私はこれをタイプしました。コンパイルの問題を起こす可能性があるため、本当にテストしませんでした)?

関連する問題