Using JAX-WS: How can I set the user agent property

前端 未结 3 665
渐次进展
渐次进展 2021-01-04 10:23

I\'ve searched on this and found a few near misses. I\'ve created a java client to consume a web service using JAX-WS. Is there a way when using JAX to set the HTTP_USER_A

3条回答
  •  一生所求
    2021-01-04 11:02

    The solution to this kind of problem in JAX-WS is to implement a SoapMessage Handler (Interface: SOAPHandler< SOAPMessageContext >). Within that handler you insert your HTTP header into maybe already existing headers, then you give control to the next handler in the handler chain.

    The concept of this handler chain is kind of nice, you can have small classes for a very specific purpose (Security, Logging etc.).

    In your client you configure the handler chain prior to sending any request:

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

    And here is the code for the HTTPUserAgentHandler:

    public class HTTPUserAgentHandler implements SOAPHandler {
    
      @Override
      public boolean handleMessage(SOAPMessageContext context) {
          boolean request = ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue();
    
          if (request) {
              @SuppressWarnings("unchecked")
              Map> headers = (Map>) context
                      .get(MessageContext.HTTP_REQUEST_HEADERS);
              if (null == headers) {
                  headers = new HashMap>();
              }
              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 getHeaders() {
          return null;
      }
    
    }
    

提交回复
热议问题