问题描述
|
我对此进行了搜索,发现了一些差点错过。我已经创建了一个Java客户端来使用JAX-WS使用Web服务。使用JAX设置HTTP_USER_AGENT值时,有没有办法?我想在特定客户端(我的用户)访问Web服务日志时使用它,因此我想要一个自定义的值。
我已经看到了在系统属性中进行设置的选项,但这似乎不起作用。生成的JAX类似乎没有对连接对象的直接引用,因此我看不到如何操作这些类。
任何帮助都会很棒。
谢谢
ST
解决方法
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;
}
}
,不知道这是否是最好/最直接的方法,但是我认为您可以在分派javax.xml.ws.Binding中的处理程序链中添加自定义javax.xml.ws.handler.Handler。在Handler中,您应该能够使用MessageContext.HTTP_REQUEST_HEADERS属性在传出的MessageContext上设置额外的HTTP标头的自定义映射。
,让我质疑首先拥有HTTP标头的想法。
一种更正确(以WS为中心)的方法是设置SOAP Header,而不是HTTP Header。考虑一下:SOAP消息不仅可以通过HTTP传递,还可以通过JMS,SMTP或自定义传输传递。通过要求具有用户代理HTTP标头,即使当前流行,您也不必将代码仅绑定到一种传输。
这就是BTW为什么JAX-WS除了处理程序外没有HTTP标头的原因。
而且(当然),StackOverlow知道如何创建SOAP标头。