WebService接口,被调用方实现增加soapenv:Header头部信息(cxf拦截器SOAPHeadOutInterceptor)

cxf拦截器增加header验证信息

提示:这个是在做一个内外网交互的项目时,遇到的问题,由于内网部署的接口需要转发并验证头部信息、版本信息等,故需要在请求时增加header信息。


  • 自定义用户口令,自己在请求报文的soapenv:header中增加口令
<soap:Header>
	<AppId>111111</AppId>
</soap:Header>

一、新增一个拦截器

具体代码如下:

package com.xxx;

import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * SOAP Head信息,调用测试前拦截设置header信息
 */
public class SOAPHeadOutInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

	public SOAPHeadOutInterceptor() {
		super(Phase.PRE_PROTOCOL);
	}
	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		 Document document = DOMUtils.createDocument();
		 List<Header> headers = message.getHeaders();		 
		 Element appId = document.createElement("AppId");//此处创建的元素应该与服务器的拦截元素相同
		 appId.setTextContent(InitProperty.SOAP_APPID);
		 headers.add(new Header(new QName("AppId"),appId));	
	}
}

二、使用拦截器

1.在生成的cxf接口文件下记得更改调用的路径

public class YysjnoImplService extends Service{

    public final static URL YYSJNOIMPLSERVICE_WSDL_LOCATION;
    private final static WebServiceException YYSJNOIMPLSERVICE_EXCEPTION;
    public final static QName YYSJNOIMPLSERVICE_QNAME = new QName("http://mk.soa.csg.cn", "YysjnoImplService");

    static {
        URL url = null;
        WebServiceException e = null;
        try {
        	//InitProperty.SOAP_PATH--这个是接口调用的路径
            url = new URL(InitProperty.SOAP_PATH + "/YYSJNO?wsdl");
        } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
       }
        YYSJNOIMPLSERVICE_WSDL_LOCATION = url;
        YYSJNOIMPLSERVICE_EXCEPTION = e;
    }

    public YysjnoImplService() {
        super(__getWsdlLocation(), YYSJNOIMPLSERVICE_QNAME);
    }

    public YysjnoImplService(WebServiceFeature... features) {
        super(__getWsdlLocation(), YYSJNOIMPLSERVICE_QNAME, features);
    }

    public YysjnoImplService(URL wsdlLocation) {
        super(wsdlLocation, YYSJNOIMPLSERVICE_QNAME);
    }

    public YysjnoImplService(URL wsdlLocation, WebServiceFeature... features) {
        super(wsdlLocation, YYSJNOIMPLSERVICE_QNAME, features);
    }

    public YysjnoImplService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public YysjnoImplService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) {
        super(wsdlLocation, serviceName, features);
    }

    @WebEndpoint(name = "YysjnoPort")
    public Yysjno getYysjnoPort() {
        return super.getPort(new QName("http://mk.soa.csg.cn", "YysjnoPort"), Yysjno.class);
    }

    @WebEndpoint(name = "YysjnoPort")
    public Yysjno getYysjnoPort(WebServiceFeature... features) {
        return super.getPort(new QName("http://mk.soa.csg.cn", "YysjnoPort"), Yysjno.class, features);
    }

    private static URL __getWsdlLocation() {
        if (YYSJNOIMPLSERVICE_EXCEPTION!= null) {
            throw YYSJNOIMPLSERVICE_EXCEPTION;
        }
        return YYSJNOIMPLSERVICE_WSDL_LOCATION;
    }

}

2.在调用接口的地方增加如下内容

具体代码如下:

		YysjnoImplService service = new YysjnoImplService(YysjnoImplService.SERVICE, YysjnoImplService.QNAME);
		Yysjno port = service.getYysjnoPort();
		Client client= ClientProxy.getClient(port);  
        client.getOutInterceptors().add(this.getOutInterceptor());
        client.getOutInterceptors().add(new SOAPHeadOutInterceptor());
        client.getInInterceptors().add(this.getInInterceptor());
		YysjnoResponse _return = port.yysjno(parameters);

3.特别需要注意的是调用的方法

一定使用 port进行调用
在这里插入图片描述

总结

这里对文章进行总结:
以上内容其实很简单,如果要加的话直接复制粘贴文档的代码进行就可以了,最最重要的一点就是上面指出来的port,我被这个坑惨了,最后还是大佬给我点出来这个有问题,改了之后立马能调用了咧,想哭了都哈哈哈哈哈😄

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值