[英]CXF: Add implicit headers to WSDL and WADL responses for a CXF SOAP/REST web service
我正在尝试为CXF SOAP / REST Web服务(由Camel管理)的WSDL和WADL响应添加隐式标头。
(这些不一定是安全标题....)
通过“隐式标头”,我的意思是,点击服务的WSDL / WADL URL将显示客户端期望在请求中提供标头。
但我不想在Web服务的签名中明确指定标头。
我有一个CXF拦截器,它为每个SOAP / REST响应添加一个隐式头。
因此,由于WSDL / WADL文档是作为对某些GET请求的响应而发送的,所以我想以某种方式使用类似的拦截器将头数据添加到WSDL / WADL响应中。 我怎么能进行这样一个奇妙的壮举?
这是CXF拦截器,它为每个SOAP / REST响应添加一个隐式头:
public class MyInterceptor extends AbstractPhaseInterceptor<Message> {
public MyInterceptor()
{
super(Phase.RECEIVE);
}
@Override
public void handleMessage(Message message)
{
try
{
//soap
if (message instanceof SoapMessage)
{
List<Header> headers = ((SoapMessage)message).getHeaders();
Header dummyHeader = new Header(new QName("uri:org.apache.cxf", "dummy"), "decapitated", new JAXBDataBinding(String.class));
headers.add(dummyHeader);
}
//rest
else
{
Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS);
String dummyHeader = "decapitated";
headers.put("dummy", Collections.singletonList(dummyHeader));
}
}
catch (JAXBException e)
{
throw new Fault(e);
}
}
@Override
public void handleFault(Message messageParam)
{
}
}
在CXF中,WSDL是通过一个名为WSDLGetInterceptor
链中的Interceptor生成的,它位于READ
链中。
它的基本设计是
采取行动的最简单方法是抢占这个拦截器,使其无法通过之前注册您自己的实现来完成其工作。
删除标准的CXF拦截器在默认的总线上是一件“难事”(最简单的方法是注册你自己的拦截器,把它放在链中,然后让它删除其他拦截器,如message.getInterceptorChain().remove(removeInterceptor);
但是在标准WSDL拦截器之前添加自己的东西很简单:
public MyWSDLGetInterceptor() {
super(Phase.READ);
addBefore(WSDLGetInterceptor.class.getName());
}
MyWSDLGetInterceptor
将扩展标准的WSDLGetInterceptor
,您只需覆盖:
public Document getDocument(Message message,
String base,
Map<String, String> params,
String ctxUri,
EndpointInfo endpointInfo) {
Document domDocument = super.getDocument(message, base, params, ctxUri, endpointInfo);
domDocument.getChildNodes(); // Whatever you need to add remove
return domDocument; // Once modified
}
您可以动态修改生成的DOM Document(添加/创建DOM节点)或通过XSLT,无论您最喜欢什么,您都可以通过标准API处理标准XML。
校长是相同的,但拦截器的工作方式不同。
WSDLGetOutInterceptor
WSDLGetOutInterceptor
执行其序列化作业 所以它有点难/干净。 但是使用相同的预占基础拦截器的原则(之前注册自己),你可以通过outMessage.get(DOCUMENT_HOLDER)
访问WSDL来覆盖cleanUpOutInteceptors
来操纵消息,就像在2.7.4情况下一样。
对不起,我没有专业知识,但我猜CXF对两者都有相同的架构......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.