使用 Apache Camel(Java DSL)拦截 cxf 网络服务 header
Intercepting cxf web service header with Apache Camel (Java DSL)
我创建了一个 Web 服务客户端来使用 apache camel 处理 cxf soap Web 服务。
String serviceUri = "cxf:http://localhost:10000/myservice?serviceClass=" +
MyRequest.class.getCanonicalName();
from(uri).to("mock:xyz");
Web 服务收到 soap 调用但抛出异常,因为该请求需要处理 wss。
org.apache.cxf.binding.soap.SoapFault: MustUnderstand headers: [{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood.
原因是,服务需要ws安全,请求llok就可以看到
<SOAP-ENV:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" SOAP-ENV:mustUnderstand="1">
我发现我需要实现一个拦截器来处理 header 属性。
我的问题:
如何添加拦截器来处理 Camel header 属性 Java-DSL?
这是否足以消除 SOAP 错误?
你可以通过
cxfEndpointConfigurer 选项@see:Camel-CXF configuration
(我使用 Spring(它更容易)),但我猜 DSL URI 看起来像:
String serviceUri = "cxf:http://localhost:10000/myservice?serviceClass=" +
MyRequest.class.getCanonicalName() +
"&cxfEndpointConfigurer="+ MyConfigurer.class.getCanonicalName();
通过实施 org.apache.camel.component.cxf.CxfEndpointConfigurer 您可以在 configureServer 方法中添加拦截器
server.getEndpoint().getInInterceptors().add(new MyJAASLoginInterceptor());
如果你 运行 你的 Camel 在 JAAS 容器中(比如 JBOSS),你可以使用来自
的扩展
org.apache.cxf.interceptor.security.JAASLoginInterceptor
具有所需的回调处理程序。
验证来自 WSS header 的 user/password 针对 JBOSS 用户的简单示例:
public class MyJAASLoginInterceptor extends javax.security.auth.callback.JAASLoginInterceptor {
@Override
protected CallbackHandler getCallbackHandler(String name, String password) {
return new org.apache.cxf.interceptor.security.NamePasswordCallbackHandler(name, password, "setCredential");
}
}
我创建了一个 Web 服务客户端来使用 apache camel 处理 cxf soap Web 服务。
String serviceUri = "cxf:http://localhost:10000/myservice?serviceClass=" +
MyRequest.class.getCanonicalName();
from(uri).to("mock:xyz");
Web 服务收到 soap 调用但抛出异常,因为该请求需要处理 wss。
org.apache.cxf.binding.soap.SoapFault: MustUnderstand headers: [{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood.
原因是,服务需要ws安全,请求llok就可以看到
<SOAP-ENV:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" SOAP-ENV:mustUnderstand="1">
我发现我需要实现一个拦截器来处理 header 属性。
我的问题:
如何添加拦截器来处理 Camel header 属性 Java-DSL?
这是否足以消除 SOAP 错误?
你可以通过 cxfEndpointConfigurer 选项@see:Camel-CXF configuration
(我使用 Spring(它更容易)),但我猜 DSL URI 看起来像:
String serviceUri = "cxf:http://localhost:10000/myservice?serviceClass=" +
MyRequest.class.getCanonicalName() +
"&cxfEndpointConfigurer="+ MyConfigurer.class.getCanonicalName();
通过实施 org.apache.camel.component.cxf.CxfEndpointConfigurer 您可以在 configureServer 方法中添加拦截器
server.getEndpoint().getInInterceptors().add(new MyJAASLoginInterceptor());
如果你 运行 你的 Camel 在 JAAS 容器中(比如 JBOSS),你可以使用来自
的扩展org.apache.cxf.interceptor.security.JAASLoginInterceptor
具有所需的回调处理程序。 验证来自 WSS header 的 user/password 针对 JBOSS 用户的简单示例:
public class MyJAASLoginInterceptor extends javax.security.auth.callback.JAASLoginInterceptor {
@Override
protected CallbackHandler getCallbackHandler(String name, String password) {
return new org.apache.cxf.interceptor.security.NamePasswordCallbackHandler(name, password, "setCredential");
}
}