我已經搜索了這個,並發現了幾個錯過。我創建了一個Java客戶端來使用JAX-WS來使用Web服務。使用JAX設置HTTP_USER_AGENT值有什麼方法嗎?我想在特定客戶端(我的)訪問它時使用我的Web服務日誌,所以我想要一個自定義的值。使用JAX-WS:我如何設置用戶代理屬性
我已經看到了在系統屬性中設置它的選項,但這似乎不起作用。生成的JAX類似乎沒有對連接對象的直接引用,所以我沒有看到如何操作這些類。
任何幫助將是偉大的。 感謝 ST
我已經搜索了這個,並發現了幾個錯過。我創建了一個Java客戶端來使用JAX-WS來使用Web服務。使用JAX設置HTTP_USER_AGENT值有什麼方法嗎?我想在特定客戶端(我的)訪問它時使用我的Web服務日誌,所以我想要一個自定義的值。使用JAX-WS:我如何設置用戶代理屬性
我已經看到了在系統屬性中設置它的選項,但這似乎不起作用。生成的JAX類似乎沒有對連接對象的直接引用,所以我沒有看到如何操作這些類。
任何幫助將是偉大的。 感謝 ST
不知道這是最好的/最直接的方式做到這一點,但我認爲你可以在調度javax.xml定製javax.xml.ws.handler.Handler添加到處理程序鏈.ws.Binding。在處理程序中,您應該可以使用MessageContext.HTTP_REQUEST_HEADERS屬性在傳出的MessageContext上設置額外http標頭的自定義映射。
讓我質疑首先使用HTTP標頭的想法。
更正確(以WS爲中心)的方法是設置SOAP標頭,而不是HTTP標頭。考慮一下:SOAP消息不僅可以通過HTTP傳遞,還可以通過JMS,SMTP或自定義傳輸傳遞。通過要求擁有用戶代理HTTP標頭,您不必將您的代碼綁定到一個傳輸,儘管目前占主導地位。
這就是爲什麼BTW爲什麼JAX-WS除了處理程序之外沒有HTTP頭的概念。
(當然)StackOverlow knows如何創建SOAP標頭。
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;
}
}
幹得漂亮。爲我工作。謝謝。 – yngwietiger 2015-08-06 19:51:04