You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Axis调用含Header信息的Soup WebService?求Java示例

Java调用带WSSE安全Header及自定义Header的WebService示例

一、Axis框架实现步骤

1. 生成客户端代码

使用Axis自带的WSDL2Java工具生成客户端代码:

java org.apache.axis.wsdl.WSDL2Java -p com.test.client https://128.0.0.1/test/wsdl

生成后会得到对应服务的Stub类和相关实体类。

2. 编写调用代码

手动构造WSSE安全Header和自定义的loginInformation Header:

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.SOAPHeaderElement;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
import java.net.URL;

public class AxisWebServiceClient {
    public static void main(String[] args) throws Exception {
        String endpoint = "https://128.0.0.1/test/wsdl";
        Service service = new Service();
        Call call = (Call) service.createCall();
        call.setTargetEndpointAddress(new URL(endpoint));

        // 设置服务方法的QName(根据生成的Stub类调整)
        QName operationQName = new QName("http://gheo1.test.com", "Request");
        call.setOperationName(operationQName);

        // 构造WSSE安全Header
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        Element securityElement = doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Security");
        securityElement.setAttribute("xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");

        Element usernameTokenElement = doc.createElement("wsse:UsernameToken");
        Element usernameElement = doc.createElement("wsse:Username");
        usernameElement.setTextContent("test_user");
        Element passwordElement = doc.createElement("wsse:Password");
        passwordElement.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
        passwordElement.setTextContent("test123");

        usernameTokenElement.appendChild(usernameElement);
        usernameTokenElement.appendChild(passwordElement);
        securityElement.appendChild(usernameTokenElement);

        SOAPHeaderElement wsseHeader = new SOAPHeaderElement(securityElement);
        call.addHeader(wsseHeader);

        // 构造自定义loginInformation Header
        Element loginInfoElement = doc.createElementNS("com.test.common", "soapheader:loginInformation");
        Element userIdElement = doc.createElement("soapheader:loginUserID");
        userIdElement.setTextContent("USERID");
        Element userTypeElement = doc.createElement("soapheader:loginUserType");
        userTypeElement.setTextContent("CUSTOMER");
        Element uniqueKeyElement = doc.createElement("soapheader:loginUserUniqueKey");
        uniqueKeyElement.setTextContent("123456");
        Element userRoleElement = doc.createElement("soapheader:loginUserRole");
        userRoleElement.setTextContent("CUSTOMER");

        loginInfoElement.appendChild(userIdElement);
        loginInfoElement.appendChild(userTypeElement);
        loginInfoElement.appendChild(uniqueKeyElement);
        loginInfoElement.appendChild(userRoleElement);

        SOAPHeaderElement customHeader = new SOAPHeaderElement(loginInfoElement);
        call.addHeader(customHeader);

        // 构造请求参数(使用生成的实体类赋值)
        RequestArg arg0 = new RequestArg();
        arg0.setAccountNumber("123");
        arg0.setGroupNumber("456");
        arg0.setAuthGroupNumber("789");
        arg0.setAuthAccountNumber("123");
        arg0.setAuthCertificateNumber("555");

        Object[] params = new Object[]{arg0};
        Object response = call.invoke(params);
        System.out.println("服务响应:" + response.toString());
    }
}

二、CXF框架实现步骤(推荐,更简洁)

1. 生成客户端代码

使用CXF的wsdl2java工具:

wsdl2java -p com.test.client https://128.0.0.1/test/wsdl

2. 编写调用代码

通过拦截器添加WSSE Header,直接API设置自定义Header:

import com.test.client.Request;
import com.test.client.RequestArg;
import com.test.client.WebServicePortType;
import com.test.client.WebServiceService;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.wss4j.dom.handler.WSHandlerConstants;

import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.Map;

public class CxfWebServiceClient {
    public static void main(String[] args) {
        WebServicePortType port = new WebServiceService().getWebServicePort();
        Client client = ClientProxy.getClient(port);

        // 添加WSSE安全拦截器
        Map<String, Object> props = new HashMap<>();
        props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        props.put(WSHandlerConstants.USER, "test_user");
        props.put(WSHandlerConstants.PASSWORD_TYPE, "PasswordText");
        props.put(WSHandlerConstants.PW_CALLBACK_CLASS, TestPasswordCallback.class.getName());
        client.getOutInterceptors().add(new WSS4JOutInterceptor(props));

        // 添加自定义loginInformation Header
        QName loginInfoQName = new QName("com.test.common", "loginInformation", "soapheader");
        Map<String, Object> loginInfoMap = new HashMap<>();
        loginInfoMap.put("loginUserID", "USERID");
        loginInfoMap.put("loginUserType", "CUSTOMER");
        loginInfoMap.put("loginUserUniqueKey", "123456");
        loginInfoMap.put("loginUserRole", "CUSTOMER");
        client.getRequestContext().put(Client.REQUEST_HEADERS, Map.of(loginInfoQName, loginInfoMap));

        // 构造请求参数
        RequestArg arg0 = new RequestArg();
        arg0.setAccountNumber("123");
        arg0.setGroupNumber("456");
        arg0.setAuthGroupNumber("789");
        arg0.setAuthAccountNumber("123");
        arg0.setAuthCertificateNumber("555");

        Request request = new Request();
        request.setArg0(arg0);

        // 调用服务
        Object response = port.request(request);
        System.out.println("服务响应:" + response.toString());
    }

    // 密码回调类
    public static class TestPasswordCallback implements org.apache.wss4j.dom.callback.PasswordCallback {
        @Override
        public void handle(javax.security.auth.callback.Callback[] callbacks) throws javax.security.auth.callback.UnsupportedCallbackException {
            org.apache.wss4j.dom.callback.PasswordCallback pc = (org.apache.wss4j.dom.callback.PasswordCallback) callbacks[0];
            pc.setPassword("test123");
        }
    }
}

注意事项

  • 确保项目引入对应框架依赖:Axis需axis、axis-jaxrpc等;CXF需cxf-core、cxf-rt-frontend-jaxws、cxf-rt-ws-security等。
  • 生成客户端代码前确认WSDL地址可正常访问,若有证书问题需提前处理。
  • 代码中的QName、类名需根据实际生成的客户端代码调整。

内容的提问来源于stack exchange,提问作者Moon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:45:00