我需要在 Web 服务客户端和驻留在不同平台上的服务本身之间创建一个代理。目的是在将请求传递给实际服务之前对某些 XML 节点进行一些验证。如果验证成功,客户端将像今天一样收到答案,而不会注意到代理的存在。
它将运行的平台是一个 java 服务器,所以我的第一个想法是构建一个 servlet 来完成这项任务。明天我将开始运行一些测试代码,但我会很感激任何关于如何事先实现它的提示。
我需要在 Web 服务客户端和驻留在不同平台上的服务本身之间创建一个代理。目的是在将请求传递给实际服务之前对某些 XML 节点进行一些验证。如果验证成功,客户端将像今天一样收到答案,而不会注意到代理的存在。
它将运行的平台是一个 java 服务器,所以我的第一个想法是构建一个 servlet 来完成这项任务。明天我将开始运行一些测试代码,但我会很感激任何关于如何事先实现它的提示。
这是基于 JAX-WS 提供程序的代理/网关的伪代码:
@WebServiceProvider
public class ServiceGateway implements Provider<SOAPMessage> {
private static final QName SERVICE_NAME = new QName("http://ws.com",
"Service");
private static final QName PORT_NAME = new QName("http://ws.com", "Port");
private static final String FAULT_MESSAGE = "fault.message";
private static final Service service = Service.create(SERVICE_NAME);
@Override
public SOAPMessage invoke(SOAPMessage inboundMessage) {
Dispatch<SOAPMessage> dispatch = service.createDispatch(PORT_NAME,
SOAPMessage.class, Mode.MESSAGE);
dispatch.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://real.destination.address");
// Handler is required to pass SOAPFault messages
@SuppressWarnings("rawtypes")
List<Handler> handlers = new ArrayList<Handler>(dispatch.getBinding()
.getHandlerChain());
handlers.add(new SOAPHandler<SOAPMessageContext>() {
@Override
public void close(MessageContext context) {
}
@Override
public boolean handleFault(SOAPMessageContext context) {
context.put(FAULT_MESSAGE, context.getMessage());
context.setScope(FAULT_MESSAGE, Scope.APPLICATION);
return true;
}
@Override
public boolean handleMessage(SOAPMessageContext context) {
return true;
}
@Override
public Set<QName> getHeaders() {
return null;
}
});
dispatch.getBinding().setHandlerChain(handlers);
try {
return dispatch.invoke(inboundMessage);
} catch (SOAPFaultException exception) {
return (SOAPMessage) dispatch.getResponseContext().get(
FAULT_MESSAGE);
}
}
}