2016-02-29 80 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