记录jax-ws http请求和响应

我需要在JAX-WS WebService调用中记录完整的http请求和响应。 对于请求,我需要请求标头和正文以及响应,响应标头和正文。

经过一番研究,我发现我可以通过该属性获取此信息:

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 

并显示我需要的信息,但它将其转储到控制台,我需要将其存储在具有内部请求ID的数据库中。

我试图实现一个处理程序:

 public class LoggingHandler implements SOAPHandler { @Override public boolean handleMessage(SOAPMessageContext context) { Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outbound) { System.out.println("SOAP outbound!!!!!"); Map<String, List> responseHeaders = (Map<String, List>) context .get(SOAPMessageContext.HTTP_RESPONSE_HEADERS); try { String headers = getHeaders(responseHeaders); System.out.println(headers); String body = getBody(context.getMessage()); System.out.println(body); } catch (Exception ex) { // TODO: What do I have to do in this case? } } else { System.out.println("SOAP inbound!!!!!"); Map<String, List> requestHeaders = (Map<String, List>) context .get(SOAPMessageContext.HTTP_REQUEST_HEADERS); try { String headers = getHeaders(requestHeaders); System.out.println(headers); String body = getBody(context.getMessage()); System.out.println(body); } catch (Exception ex) { // TODO: What do I have to do in this case? } } return true; } private String getBody(SOAPMessage message) throws SOAPException, IOException { OutputStream stream = new ByteArrayOutputStream(); message.writeTo(stream); return stream.toString(); } public String getFullHttpRequest(HttpServletRequest request) throws IOException { InputStream in = request.getInputStream(); String encoding = request.getCharacterEncoding(); encoding = encoding == null ? "UTF-8" : encoding; String body = IOUtils.toString(in, encoding); return body; } private String getHeaders(Map<String, List> headers) throws IOException { StringBuffer result = new StringBuffer(); if (headers != null) { for (Entry<String, List> header : headers.entrySet()) { if (header.getValue().isEmpty()) { // I don't think this is legal, but let's just dump it, // as the point of the dump is to uncover problems. result.append(header.getValue()); } else { for (String value : header.getValue()) { result.append(header.getKey() + ": " + value); } } result.append("\n"); } } return result.toString(); } } 

但在这种情况下,我可以获取http请求标题和正文但在响应中,我只获取正文,http响应标题始终为空。

关于如何实现这一点的任何想法? 目标是能够将完整的http请求和响应存储在数据库中。

谢谢!!

你也可以试试

  -Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true 

我假设您从某种Java EE应用程序服务器(而不是来自独立客户端)中提供Web服务。 您无法在Web / Java EE容器的上下文之外访问Java EE基础结构,如HttpServletRequestHttpServletResponse

您可以尝试使用实际的servlet响应对象(在Web上下文中)

  HttpServletResponse response = (HttpServletResponse) messageContext.get(SOAPMessageContext.SERVLET_RESPONSE); //messageContext is the SOAPMessageContext List responseHeaderNames = (List)response.getHeaderNames(); for(String headerName : responseHeaderNames){ //Do whatever you want with it. } 

我非常怀疑你是否能够在处理程序中获得完整的响应头。 你的问题真的引起了我的兴趣,我花了很多时间研究这一部分。 在我看过的所有代码示例中,甚至地铁站点上的示例都没有尝试实现此function,我认为原因很简单。 在调用处理程序时,容器可能没有足够的确定信息来标记出站消息上的http标头。 你可以添加东西,但这也是值得怀疑的。