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,我被这个坑惨了,最后还是大佬给我点出来这个有问题,改了之后立马能调用了咧,想哭了都哈哈哈哈哈😄