使用JAX-WS:如何设置用户代理属性

问题描述

| 我对此进行了搜索,发现了一些差点错过。我已经创建了一个Java客户端来使用JAX-WS使用Web服务。使用JAX设置HTTP_USER_AGENT值时,有没有办法?我想在特定客户端(我的用户)访问Web服务日志时使用它,因此我想要一个自定义的值。 我已经看到了在系统属性中进行设置的选项,但这似乎不起作用。生成的JAX类似乎没有对连接对象的直接引用,因此我看不到如何操作这些类。 任何帮助都会很棒。 谢谢 ST     

解决方法

JAX-WS中此类问题的解决方案是实现SoapMessage Handler(接口:SOAPHandler )。 在该处理程序中,将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;
  }

}
    ,不知道这是否是最好/最直接的方法,但是我认为您可以在分派javax.xml.ws.Binding中的处理程序链中添加自定义javax.xml.ws.handler.Handler。在Handler中,您应该能够使用MessageContext.HTTP_REQUEST_HEADERS属性在传出的MessageContext上设置额外的HTTP标头的自定义映射。     ,让我质疑首先拥有HTTP标头的想法。 一种更正确(以WS为中心)的方法是设置SOAP Header,而不是HTTP Header。考虑一下:SOAP消息不仅可以通过HTTP传递,还可以通过JMS,SMTP或自定义传输传递。通过要求具有用户代理HTTP标头,即使当前流行,您也不必将代码仅绑定到一种传输。 这就是BTW为什么JAX-WS除了处理程序外没有HTTP标头的原因。 而且(当然),StackOverlow知道如何创建SOAP标头。