2011-04-12 88 views
8

我已经搜索了这个,并发现了几个错过。我创建了一个Java客户端来使用JAX-WS来使用Web服务。使用JAX设置HTTP_USER_AGENT值有什么方法吗?我想在特定客户端(我的)访问它时使用我的Web服务日志,所以我想要一个自定义的值。使用JAX-WS:我如何设置用户代理属性

我已经看到了在系统属性中设置它的选项,但这似乎不起作用。生成的JAX类似乎没有对连接对象的直接引用,所以我没有看到如何操作这些类。

任何帮助将是伟大的。 感谢 ST

回答

2

不知道这是最好的/最直接的方式做到这一点,但我认为你可以在调度javax.xml定制javax.xml.ws.handler.Handler添加到处理程序链.ws.Binding。在处理程序中,您应该可以使用MessageContext.HTTP_REQUEST_HEADERS属性在传出的MessageContext上设置额外http标头的自定义映射。

2

让我质疑首先使用HTTP标头的想法。

更正确(以WS为中心)的方法是设置SOAP标头,而不是HTTP标头。考虑一下:SOAP消息不仅可以通过HTTP传递,还可以通过JMS,SMTP或自定义传输传递。通过要求拥有用户代理HTTP标头,您不必将您的代码绑定到一个传输,尽管目前占主导地位。

这就是为什么BTW为什么JAX-WS除了处理程序之外没有HTTP头的概念。

(当然)StackOverlow knows如何创建SOAP标头。

11

JAX-WS中这种问题的解决方案是实现一个SoapMessage处理程序(接口:SOAPHandler < SOAPMessageContext>)。 在该处理程序中,您可以将HTTP头插入可能已有的头文件中,然后将控制权交给处理程序链中的下一个处理程序。

这个处理程序链的概念很好,你可以为一个特定的目的(安全,日志等)有小类。

在您的客户端配置的处理程序链发送任何请求之前:

// HandlerChain installieren 
Binding binding = ((BindingProvider) port).getBinding(); 
List hchain = binding.getHandlerChain(); 
if (hchain == null) { 
    hchain = new ArrayList(); 
} 
hchain.add(new HTTPUserAgentHandler()); 
binding.setHandlerChain(hchain); 

这里是为HTTPUserAgentHandler代码:

public class HTTPUserAgentHandler implements SOAPHandler<SOAPMessageContext> { 

    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     boolean request = ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue(); 

     if (request) { 
      @SuppressWarnings("unchecked") 
      Map<String, List<String>> headers = (Map<String, List<String>>) context 
        .get(MessageContext.HTTP_REQUEST_HEADERS); 
      if (null == headers) { 
       headers = new HashMap<String, List<String>>(); 
      } 
      headers.put("HTTP_USER_AGENT", Collections.singletonList("user_agent")); 
      context.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
     } 
     return true; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) { 
     return true; 
    } 

    @Override 
    public void close(MessageContext context) {} 

    @Override 
    public Set<QName> getHeaders() { 
     return null; 
    } 

} 
+0

干得漂亮。为我工作。谢谢。 – yngwietiger 2015-08-06 19:51:04

相关问题