我对此进行了搜索并发现了一些未遂事件。我创建了一个 java 客户端来使用 JAX-WS 来使用 Web 服务。使用 JAX 时有没有办法设置 HTTP_USER_AGENT 值?我希望在特定客户端(我的)访问它时获得我的网络服务日志,因此我想要一个自定义值。
我见过在系统属性中设置它的选项,但这似乎不起作用。生成的 JAX 类似乎没有对连接对象的直接引用,因此我不知道如何操作这些类。
任何帮助都会很棒。
谢谢
英石
JAX-WS 中此类问题的解决方案是实现一个 SoapMessage Handler(接口: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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)