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

Java 使用JAX-WS:如何设置用户代理属性,java,Java,我已经搜索过了,发现了一些未遂事件。我创建了一个java客户机,使用JAX-WS使用web服务。在使用JAX设置HTTP\U USER\U代理值时,有没有一种方法?我希望在特定客户机(我的)访问web服务日志时使用它,因此我需要自定义值 我见过在系统属性中设置它的选项,但这似乎不起作用。生成的JAX类似乎没有对连接对象的直接引用,因此我不知道如何操作这些类 任何帮助都会很好。 谢谢 ST不确定这是否是最好/最直接的方法,但我认为您可以在dispatch javax.xml.ws.handler.

我已经搜索过了,发现了一些未遂事件。我创建了一个java客户机,使用JAX-WS使用web服务。在使用JAX设置HTTP\U USER\U代理值时,有没有一种方法?我希望在特定客户机(我的)访问web服务日志时使用它,因此我需要自定义值

我见过在系统属性中设置它的选项,但这似乎不起作用。生成的JAX类似乎没有对连接对象的直接引用,因此我不知道如何操作这些类

任何帮助都会很好。 谢谢
ST

不确定这是否是最好/最直接的方法,但我认为您可以在dispatch javax.xml.ws.handler.handler中向处理程序链添加一个自定义javax.xml.ws.handler。在处理程序中,您应该能够使用MessageContext.http\u REQUEST\u headers属性在传出的MessageContext上设置额外http头的自定义映射。

让我质疑一下先使用http头的想法

更正确的(以WS为中心)方法是设置SOAP头,而不是HTTP头。考虑这一点:SOAP消息不仅可以通过HTTP传递,而且可以通过JMS、SMTP或自定义传输来传递。通过要求具有用户代理HTTP头,您可以将代码仅绑定到一个传输,尽管目前流行

顺便说一句,这就是为什么JAX-WS除了在处理程序中没有HTTP头的概念


当然,StackOverlow介绍了如何创建SOAP头。

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

}
公共类HTTPUserAgentHandler实现SOAPHandler{
@凌驾
公共布尔handleMessage(SOAPMessageContext上下文){
布尔请求=((布尔)上下文.get(SOAPMessageContext.MESSAGE_OUTBOUND_属性)).booleanValue();
如果(请求){
@抑制警告(“未选中”)
映射头=(映射)上下文
.get(MessageContext.HTTP\u请求\u头);
if(null==头){
headers=newhashmap();
}
headers.put(“HTTP_USER_AGENT”,Collections.singletonList(“USER_AGENT”));
put(MessageContext.HTTP_请求_头,头);
}
返回true;
}
@凌驾
公共布尔handleFault(SOAPMessageContext上下文){
返回true;
}
@凌驾
公共无效关闭(MessageContext上下文){}
@凌驾
公共集getHeaders(){
返回null;
}
}

有点困惑,如何用这个设置请求特定的值?因为我所拥有的只是SOAPMessageContext。