How to add header to SOAP request?

前端 未结 4 940
攒了一身酷
攒了一身酷 2020-12-04 13:58

I try to invoke HTTPS SOAP web service through java code:

    URL url = new URL(\"https://somehost:8181/services/\"SomeService?wsdl\");
    QName qname = new         


        
4条回答
  •  借酒劲吻你
    2020-12-04 14:10

    I personally add two classes: HeaderHandler and HeaderHandlerResolver:

    import java.util.HashSet;
    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;
    
    
    public class HeaderHandler implements SOAPHandler {
    
    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("test");
    
                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("test321");
    
                //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() {
        // The code below is added on order to invoke Spring secured WS.
        // Otherwise,
        // http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
        // won't be recognised 
        final QName securityHeader = new QName(
                "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
                "Security", "wsse");
    
        final HashSet headers = new HashSet();
        headers.add(securityHeader);
    
        return headers;
    }
    
    public boolean handleFault(SOAPMessageContext context) {
        //throw new UnsupportedOperationException("Not supported yet.");
        return true;
    }
    
    public void close(MessageContext context) {
    //throw new UnsupportedOperationException("Not supported yet.");
    }
    }
    

    And

    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.ws.handler.Handler;
    import javax.xml.ws.handler.HandlerResolver;
    import javax.xml.ws.handler.PortInfo;
    
    
    public class HeaderHandlerResolver implements HandlerResolver {
    
    public List getHandlerChain(PortInfo portInfo) {
      List handlerChain = new ArrayList();
    
      HeaderHandler hh = new HeaderHandler();
    
      handlerChain.add(hh);
    
      return handlerChain;
       }
    }
    

    In the HeaderHandler class, you can add needed credentials. To use them finally:

    HeaderHandlerResolver handlerResolver = new HeaderHandlerResolver();
    service.setHandlerResolver(handlerResolver);
    

提交回复
热议问题