2013-03-17 68 views
0

我需要在Web服务客户端和驻留在不同平台上的服务本身之间创建代理。目的是在将请求传递给真实服务之前对某些XML节点进行一些验证。如果验证成功,客户将会收到与现在一样的答案,而不会注意到代理的存在。构建Web服务的代理servlet

它将运行的平台是一个java服务器,所以我的第一个想法是构建一个servlet来完成这项任务。我将在明天开始运行一些测试代码,但是我希望提前了解如何实现这一点。

+0

你有访问应用程序的源代码,并且它使用JAX-WS写的? – 2013-03-17 18:33:58

+0

是的,我的确是JAX-WS。 – xain 2013-03-17 19:31:03

+0

在我看来你应该把验证器写成SOAPHandler。 SOAPHandler比基于servlet的soap代理更容易实现和维护。如果SOAPHandler不是一个选项(您有很多服务,或者出于安全原因您更愿意分离验证),那么您可能需要考虑使用JAX-WS提供程序接口来实现代理。 – 2013-03-17 19:55:58

回答

0

下面是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); 
     } 
    } 
}