2011-04-12 87 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

相關問題