JAX-WS - Adding SOAP Headers

后端 未结 10 2251
鱼传尺愫
鱼传尺愫 2020-12-05 02:11

I am trying to create a standalone client to consume some web services. I must add my username and password to the SOAP Header. I tried adding the credentials as follows:

10条回答
  •  一生所求
    2020-12-05 03:06

    I'm adding this answer because none of the others worked for me.

    I had to add a Header Handler to the Proxy:

    import java.util.Set;
    import java.util.TreeSet;
    
    import javax.xml.namespace.QName;
    import javax.xml.soap.SOAPElement;
    import javax.xml.soap.SOAPEnvelope;
    import javax.xml.soap.SOAPFactory;
    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 SOAPHeaderHandler implements SOAPHandler {
    
        private final String authenticatedToken;
    
        public SOAPHeaderHandler(String authenticatedToken) {
            this.authenticatedToken = authenticatedToken;
        }
    
        public boolean handleMessage(SOAPMessageContext context) {
            Boolean outboundProperty =
                    (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
            if (outboundProperty.booleanValue()) {
                try {
                    SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope();
                    SOAPFactory factory = SOAPFactory.newInstance();
                    String prefix = "urn";
                    String uri = "urn:xxxx";
                    SOAPElement securityElem =
                            factory.createElement("Element", prefix, uri);
                    SOAPElement tokenElem =
                            factory.createElement("Element2", prefix, uri);
                    tokenElem.addTextNode(authenticatedToken);
                    securityElem.addChildElement(tokenElem);
                    SOAPHeader header = envelope.addHeader();
                    header.addChildElement(securityElem);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                // inbound
            }
            return true;
        }
    
        public Set getHeaders() {
            return new TreeSet();
        }
    
        public boolean handleFault(SOAPMessageContext context) {
            return false;
        }
    
        public void close(MessageContext context) {
            //
        }
    }
    

    In the proxy, I just add the Handler:

    BindingProvider bp =(BindingProvider)basicHttpBindingAuthentication;
    bp.getBinding().getHandlerChain().add(new SOAPHeaderHandler(authenticatedToken));
    bp.getBinding().getHandlerChain().add(new SOAPLoggingHandler());
    

提交回复
热议问题