【问题标题】:How to include SOAP authentication details in header?如何在标头中包含 SOAP 身份验证详细信息?
【发布时间】:2016-01-01 07:12:53
【问题描述】:

这是我的 SOAP 请求

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header>
        <Security>
            <UsernameToken>
                <SiteId>testlab1</SiteId>
                <Password>abcd1234</Password>
            </UsernameToken>
        </Security>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body 
    xmlns:ns3="http://www.foo.bar/ws"
    xmlns:ns5="http://http://www.foo.bar.com" 
    xmlns:ns4="http://schemas.xmlsoap.org/soap/envelope">
        <ns5:RequestObject>
            <ns3:Header>
                <AccountNo>4353454543</AccountNo>
                <CustomerId>534534</CustomerId>
                <SiteId>testlab1</SiteId>
                <RegisterId>0</RegisterId>
                <SequenceNumber>1</SequenceNumber>
                <Retry>0</Retry>
            </ns3:Header>
        </ns5:RequestObject>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

它适用于 SOAP UI 工具。但是当它使用 spring-ws 的 WebServiceTemplate 自动生成时,它不包括:

<Security>
   <UsernameToken>
        <SiteId>testlab1</SiteId>
        <Password>abcd1234</Password>
   </UsernameToken>
</Security>

加入&lt;SOAP-ENV:Header&gt;。 我可以通过我的代码包含这些身份验证详细信息吗? 任何帮助将不胜感激!

【问题讨论】:

    标签: java spring web-services


    【解决方案1】:

    如果您使用的是 spring-ws 的 WebServiceTemplate,那么您可以尝试添加 WebServiceMessageCallback 并覆盖 doWithMessage()。类似的东西:

    getWebServiceTemplate().marshalSendAndReceive("https://soap.endpoint",
        requestObj, new WebServiceMessageCallback() {
    
                        public void doWithMessage(WebServiceMessage message) {
                            try {
                                SoapMessage soapMessage = (SoapMessage)message;
                                SoapHeader header = soapMessage.getSoapHeader();
                                StringSource headerSource = new StringSource("<Security><UsernameToken><SiteId>testlab1</SiteId>"+
    "<Password>abcd1234</Password></UsernameToken></Security> ");
                                Transformer transformer = TransformerFactory.newInstance().newTransformer();
                                transformer.transform(headerSource, header.getResult());
                            } catch (Exception e) {
                                // exception handling
                            }
                        }
                    });
    

    希望在这里解决您的需求!

    【讨论】:

    • 这对我有帮助!1
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多