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

时间:2011-04-12 18:10:50

标签: java

我对此进行了搜索,发现了一些不幸的事。我创建了一个使用JAX-WS来使用Web服务的Java客户端。使用JAX设置HTTP_USER_AGENT值有没有办法?当特定客户(我的)访问它时,我想要我的Web服务日志,所以我想要一个自定义的值。

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

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

3 个答案:

答案 0 :(得分:11)

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

}

答案 1 :(得分:2)

不确定这是否是最佳/最直接的方法,但我认为您可以将自定义javax.xml.ws.handler.Handler添加到调度javax.xml.ws.Binding中的处理程序链。在Handler中,您应该能够使用MessageContext.HTTP_REQUEST_HEADERS属性在传出的MessageContext上设置额外http标头的自定义映射。

答案 2 :(得分:2)

让我质疑首先拥有HTTP标头的想法。

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

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

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