java - JAX-WS 将用户名 token 添加到 SOAP header

标签 java xml soap jax-ws

我有一个从 WSDL 文件生成的 JAX-WS 客户端。 到目前为止,设置 header 可以使用以下代码:

    WSBindingProvider bp = (WSBindingProvider) port;
    bp.setOutboundHeaders(
            Headers.create(new QName("http://schemas.xmlsoap.org/ws/2005/08/addressing", "To", "wsa"), "--To--"),
            Headers.create(new QName("http://schemas.xmlsoap.org/ws/2005/08/addressing", "Action", "wsa"), "--Action--"),
            Headers.create(new QName("http://schemas.xmlsoap.org/ws/2005/08/addressing", "MessageID", "wsa"), UUID.randomUUID().toString())
    );

(根据需要)生成以下 XML 片段:

    <S:Header>
        <To
            xmlns="http://schemas.xmlsoap.org/ws/2005/08/addressing">--to--
        </To>
        <Action
            xmlns="http://schemas.xmlsoap.org/ws/2005/08/addressing">--action--
        </Action>
        <MessageID
            xmlns="http://schemas.xmlsoap.org/ws/2005/08/addressing">fe1b400a-e724-4486-8618-b1d36a0acbbb
        </MessageID>
    </S:Header>

但我需要以下链接标签,但我无法使用 Headers.create(...) 实现:

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken wsu:Id="PartnerId" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:Username>--username--</wsse:Username>
    </wsse:UsernameToken>
</wsse:Security>

有什么想法可以将其添加到标题中吗?

最佳答案

以下代码对我有用:

        private static final String SCHEMA = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
        private static final String SCHEMA_PREFIX = "wsse";
        private static final String USERNAME = "username";
        private static final String PASSWORD = "password";

        // Create a SOAP header
        try {
            SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
            SOAPPart soapPart = soapMessage.getSOAPPart();
            SOAPEnvelope soapEnvelope = soapPart.getEnvelope();

            SOAPHeader header = soapEnvelope.getHeader();
            // Add the security SOAP header element
              SOAPHeaderElement security = header.addHeaderElement(new QName(SCHEMA, "Security", SCHEMA_PREFIX));
              SOAPElement usernameToken = security.addChildElement("UsernameToken", SCHEMA_PREFIX);
              SOAPElement usernameElement = usernameToken.addChildElement("Username", SCHEMA_PREFIX);
              SOAPElement passwordElement = usernameToken.addChildElement("Password", SCHEMA_PREFIX);
              Name typeName = soapEnvelope.createName("type");
              passwordElement.addAttribute(typeName, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
    
              usernameElement.setTextContent(USERNAME);
              passwordElement.setTextContent(PASSWORD);
    
              ((WSBindingProvider) webServicePort).setOutboundHeaders(Headers.create(security));
        } catch (SOAPException e) {
            logger.severe("Error setting SOAP header");
            e.printStackTrace();
        }

XML 如下:

<?xml version="1.0" encoding="utf-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <env:Header>
        <wsse:Security env:mustUnderstand="1">
            <wsse:UsernameToken>
                <wsse:Username>username</wsse:Username>
                <wsse:Password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </env:Header>
    <env:Body>
    ...

关于java - JAX-WS 将用户名 token 添加到 SOAP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63414620/

相关文章:

soap - 如何在 Go 中进行 SOAP 调用?

ios - 存储到 NSString 中的 SOAP 响应需要被解析

java - 无法读取重复字符

java - 无法使用 ArrayList 中对象的方法

javascript - 在导入之前/期间/之后更改 DOM 节点的命名空间

android - 未为 PreferenceActivity 的 xml 文件生成 R.xml.xyz

java - 在工作流程转换期间下载文件

java - 如何使用 gwt RequestFactory 机制来持久化 HashMap ( map )?

java - 如何使用 Java 在 xml 中打印所选父标签内的子标签属性

java - 由于 TLS 不兼容,SOAP Web 服务不接受请求