How to add header to SOAP request?

前端 未结 4 951
攒了一身酷
攒了一身酷 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:18

    Sample main Class:

    package test;
    
    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.ws.BindingProvider;
    import javax.xml.ws.handler.Handler;
    
    // next headers is generated from "NetBeans New Webservice Client"
    import sk.firma.wstest.definitions.*;
    import sk.firma.wstest.schemas.*;
    
    /**
     *
     * @author Jan
     */
    public class TestWSService {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
    
            try {
    
                WsService service = new WsService();
                Ws port = service.getWsKsSoap11();
    
                // This is the block that apply the Ws Security to the request
                BindingProvider bindingProvider = (BindingProvider) port;
                @SuppressWarnings("rawtypes")
                List handlerChain = new ArrayList();
                handlerChain.add(new WSSecurityHeaderSOAPHandler("username", "password"));
                bindingProvider.getBinding().setHandlerChain(handlerChain);
    
                // Initialize and Run Service
                InVal inVal = new InVal();
                ReturnValue retVal = port.test(inVal);
    
            } catch (Exception e) {
                e.printStackTrace();
            }       
        }
    }
    

    And now WS-Security Header SOAP Handler:

    package test;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    import java.util.TimeZone;
    
    import javax.xml.namespace.QName;
    import javax.xml.soap.SOAPElement;
    import javax.xml.soap.SOAPEnvelope;
    import javax.xml.soap.SOAPHeader;
    import javax.xml.ws.handler.MessageContext;
    import javax.xml.ws.handler.soap.SOAPHandler;
    import javax.xml.ws.handler.soap.SOAPMessageContext;
    
    public class WSSecurityHeaderSOAPHandler implements SOAPHandler {
    
        private static final String URL_WSSE_NAMESPACE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
        private static final String URL_WSU_NAMESPACE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
    
        private final String usernameText;
        private final String passwordText;
    
        public WSSecurityHeaderSOAPHandler(String usernameText, String passwordText) {
            this.usernameText = usernameText;
            this.passwordText = passwordText;
    
        }
    
        public String getCurrentDateTime() {
            /* e.g. 2001-10-13T09:00:00Z */
            final SimpleDateFormat FORMATTER_DATETIME_NO_MS = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    
            DateFormat dfETC = FORMATTER_DATETIME_NO_MS;
            dfETC.setTimeZone(TimeZone.getTimeZone("CET"));
    
            StringBuffer dateETC = new StringBuffer(dfETC.format(new Date()));
            dateETC.append('Z');
            return dateETC.toString();
        }
    
        public String getCurrentDateTimePlusDelay(long delayInSeconds) {
            /* e.g. 2001-10-13T09:00:00Z */
            final SimpleDateFormat FORMATTER_DATETIME_NO_MS = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    
            DateFormat dfETC = FORMATTER_DATETIME_NO_MS;
            dfETC.setTimeZone(TimeZone.getTimeZone("CET"));
            Date date = new Date();
    
            long timeInMsecs = date.getTime();
            date.setTime(timeInMsecs + delayInSeconds*1000L);
            StringBuffer dateETC = new StringBuffer(dfETC.format(date));
            dateETC.append('Z');
            return dateETC.toString();
        }
    
        @Override
        public boolean handleMessage(SOAPMessageContext soapMessageContext) {
    
            Boolean outboundProperty = (Boolean) soapMessageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    
            if (outboundProperty) {
    
                try {
                    SOAPEnvelope soapEnvelope = soapMessageContext.getMessage().getSOAPPart().getEnvelope();
    
                    SOAPHeader header = soapEnvelope.getHeader();
                    if (header == null) {
                        header = soapEnvelope.addHeader();
                    }
    
                    SOAPElement securityHeaderElement = header.addChildElement("Security", "wsse", URL_WSSE_NAMESPACE);
                    securityHeaderElement.addAttribute(soapEnvelope.createName("S:mustUnderstand"), "1");
    
                    // Add Timestamp element to "Security" soapHeaderElement
                    // Sample:  
                    //              2011-10-13T08:20:01.183Z
                    //              2011-10-13T17:25:01.183Z
                    //          
                    javax.xml.soap.Name timestampElementName = soapEnvelope.createName("Timestamp", "wsu", URL_WSU_NAMESPACE);
                    SOAPElement timestampSOAPElement = securityHeaderElement.addChildElement(timestampElementName);
                    String created = getCurrentDateTime(); 
                    String expires = getCurrentDateTimePlusDelay(60L*60L); /* 60 minutes delay */
    
                    // Add Created to Timestamp
                    SOAPElement createdSOAPElement = timestampSOAPElement
                            .addChildElement("Created"/* local name */, "wsu" /* prefix */, URL_WSU_NAMESPACE);
                    createdSOAPElement.addTextNode(created);
    
                    // Add Expires to Timestamp
                    SOAPElement expiresSOAPElement = timestampSOAPElement
                            .addChildElement("Expires"/* local name */, "wsu" /* prefix */,URL_WSU_NAMESPACE);
                    expiresSOAPElement.addTextNode(expires);
    
                    // Add usernameToken to "Security" soapHeaderElement
                    javax.xml.soap.Name usernameTokenElementName = soapEnvelope.createName("UsernameToken", "wsse", 
                                                URL_WSSE_NAMESPACE);
                    SOAPElement usernameTokenSOAPElement = securityHeaderElement.addChildElement(usernameTokenElementName);
    
                    // Add Username to usernameToken
                    SOAPElement userNameSOAPElement = usernameTokenSOAPElement
                            .addChildElement("Username"/* local name */, "wsse" /* prefix */, URL_WSSE_NAMESPACE);
                    userNameSOAPElement.addTextNode(this.usernameText);
    
                    // Add password to UsernameToken
                    javax.xml.soap.Name passwordElementName = soapEnvelope.createName("Password", "wsse", URL_WSSE_NAMESPACE);
                    SOAPElement passwordSOAPElement = usernameTokenSOAPElement.addChildElement(passwordElementName);
    
                    /* Add "Type" attribute to  header element */
                    //passwordSOAPElement.addAttribute(soapEnvelope.createName("Type", "", ""), 
                    //      "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
                    passwordSOAPElement.addTextNode(this.passwordText);
    
                } catch (Exception e) {
                    throw new RuntimeException("Error on wsSecurityHandler: " + e.getMessage());
                }
    
            }
    
            return true;
        }
    
        @Override
        public void close(MessageContext context) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public boolean handleFault(SOAPMessageContext context) {
            // TODO Auto-generated method stub
            return true;
        }
    
        @Override
        public Set getHeaders() {
            // throw new UnsupportedOperationException("Not supported yet.");
            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;
        }
    
    }
    

提交回复
热议问题