JAX-WS - Adding SOAP Headers

后端 未结 10 2246
鱼传尺愫
鱼传尺愫 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:03

    Data can be transferred in SOAP header (JaxWS) by using @WebParam(header = true):

    @WebMethod(operationName = "SendRequest", action = "http://abcd.ru/")
    @Oneway
    public void sendRequest(
        @WebParam(name = "Message", targetNamespace = "http://abcd.ru/", partName = "Message")
        Data message,
        @WebParam(name = "ServiceHeader", targetNamespace = "http://abcd.ru/", header = true, partName = "ServiceHeader")
        Header serviceHeader);
    

    If you want to generate a client with SOAP Headers, you need to use -XadditionalHeaders:

    wsimport -keep -Xnocompile -XadditionalHeaders -Xdebug http://12.34.56.78:8080/TestHeaders/somewsdl?wsdl -d /home/evgeny/DEVELOPMENT/JAVA/gen
    

    If don't need @Oneway web service, you can use Holder:

    @WebMethod(operationName = "SendRequest", action = "http://abcd.ru/")
    public void sendRequest(
        @WebParam(name = "Message", targetNamespace = "http://abcd.ru/", partName = "Message")
        Data message,
        @WebParam(name = "ServiceHeader", targetNamespace = "http://abcd.ru/", header = true, partName = "ServiceHeader")
        Holder<Header> serviceHeader);
    
    0 讨论(0)
  • 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<SOAPMessageContext> {
    
        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<QName> 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());
    
    0 讨论(0)
  • 2020-12-05 03:09

    Also, if you're using Maven to build your project, you'll need to add the following dependency:

        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>{currentversion}/version>
        </dependency>
    

    This provides you with the class com.sun.xml.ws.developer.WSBindingProvider.

    Link: https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt

    0 讨论(0)
  • 2020-12-05 03:16

    you can add the username and password to the SOAP Header

    BindingProvider prov = (BindingProvider)port;
    prov.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                    "your end point"));
    Map<String, List<String>> headers = new HashMap<String, List<String>>();
    prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myusername");
    prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");
    prov.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers);
    
    0 讨论(0)
提交回复
热议问题