使用JAX-WS:如何设置用户代理属性
我对此进行了搜索,发现了一些近乎未命中的情况。 我创建了一个使用JAX-WS来使用Web服务的java客户端。 使用JAX设置HTTP_USER_AGENT值有没有办法? 我希望在特定客户(我的)访问它时拥有我的Web服务日志,所以我想要一个自定义的值。
我已经看到了在系统属性中设置它的选项,但这似乎不起作用。 生成的JAX类似乎没有对连接对象的直接引用,所以我看不出如何操作这些类。
任何帮助都会很棒。 谢谢ST
JAX-WS中此类问题的解决方案是实现SoapMessage Handler(接口:SOAPHandler
这个处理程序链的概念很好,你可以为一个非常特定的目的(安全,记录等)提供小类。
在您的客户端中,您在发送任何请求之前配置处理程序链:
// 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 { @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; } }
不确定这是否是最好/最直接的方法,但我认为你可以在调度javax.xml.ws.Binding中的处理程序链中添加一个自定义的javax.xml.ws.handler.Handler。 在Handler中,您应该能够使用MessageContext.HTTP_REQUEST_HEADERS属性在传出的MessageContext上设置额外http标头的自定义映射。
让我质疑首先拥有HTTP头的想法。
更正确(以WS为中心)的方法是设置SOAP Header,而不是HTTP头。 考虑一下:SOAP消息不仅可以通过HTTP传递,还可以通过JMS,SMTP或自定义传输传递。 通过要求具有用户代理HTTP头,您不必要将代码绑定到仅一个传输,尽管目前普遍存在。
这就是为什么除了处理程序之外,JAX-WS没有HTTP头的概念的原因。
而且(当然)StackOverlow 知道如何创建SOAP头。
- Mapbox Android SDK崩溃 – “java.lang.Error:顶点着色器填充无法编译”
- 在JVM正常退出后,Files.createTempDirectory是否删除目录?
- 如何在Android的OpenCV中在Touch上的框架上绘制多个矩形?
- Java:如果未知,我如何初始化数组大小?
- 如何在Java中添加环境变量?
- 我们可以从java中的子类调用Parent的main()方法吗?
- 使用Java客户端和X-Pack / HTTPS连接到ElasticSearch Cloud 5.x.
- 使用Apache POI创建.xlsx文件时的java.lang.NoClassDefFoundError
- 推荐用于数字签名的加密组合