2016-02-29 79 views

回答

0

我已經嘗試過此之前,我認爲生成客戶端代碼來調用ws安全的Web服務的解決方案是手動創建wsse頭。 例如何實現SOAPHandler類:

package com.javadb.ws.example; 

import java.util.Set; 
import javax.xml.namespace.QName; 
import javax.xml.soap.SOAPElement; 
import javax.xml.soap.SOAPEnvelope; 
import javax.xml.soap.SOAPHeader; 
import javax.xml.soap.SOAPMessage; 
import javax.xml.ws.handler.MessageContext; 
import javax.xml.ws.handler.soap.SOAPHandler; 
import javax.xml.ws.handler.soap.SOAPMessageContext; 

/** 
* 
* @author www.javadb.com 
*/ 
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> { 

    public boolean handleMessage(SOAPMessageContext smc) { 

     Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

     if (outboundProperty.booleanValue()) { 

      SOAPMessage message = smc.getMessage(); 

      try { 

       SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope(); 
       SOAPHeader header = envelope.addHeader(); 

       SOAPElement security = 
         header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 

       SOAPElement usernameToken = 
         security.addChildElement("UsernameToken", "wsse"); 
       usernameToken.addAttribute(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); 

       SOAPElement username = 
         usernameToken.addChildElement("Username", "wsse"); 
       username.addTextNode("TestUser"); 

       SOAPElement password = 
         usernameToken.addChildElement("Password", "wsse"); 
       password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
       password.addTextNode("TestPassword"); 

       //Print out the outbound SOAP message to System.out 
       message.writeTo(System.out); 
       System.out.println(""); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } else { 
      try { 

       //This handler does nothing with the response from the Web Service so 
       //we just print out the SOAP message. 
       SOAPMessage message = smc.getMessage(); 
       message.writeTo(System.out); 
       System.out.println(""); 

      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 


     return outboundProperty; 

    } 

    public Set getHeaders() { 
     //throw new UnsupportedOperationException("Not supported yet."); 
     return null; 
    } 

    public boolean handleFault(SOAPMessageContext context) { 
     //throw new UnsupportedOperationException("Not supported yet."); 
     return true; 
    } 

    public void close(MessageContext context) { 
    //throw new UnsupportedOperationException("Not supported yet."); 
    } 
} 

按照以下鏈接瞭解更多信息: http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client/

+1

雖然這種聯繫可以回答這個問題,最好是在這裏有答案的主要部件,並提供鏈接供參考。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/12356864) –

+1

謝謝你的有用警告。現在編輯。 – AliReza19330