登录JAX-WS HTTP请求和响应(Log jax-ws http request and res

2019-07-03 16:10发布

我需要登录一个JAX-WS Web服务调用的完整的HTTP请求和响应。 对于请求我需要的请求头和身体,为响应,响应头和身体。

一些经过研究,我发现,我可以与物业这样的信息:

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

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

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

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {

    @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<String>> responseHeaders = (Map<String, List<String>>) 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<String>> requestHeaders = (Map<String, List<String>>) 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<String>> headers) throws IOException {
        StringBuffer result = new StringBuffer();
        if (headers != null) {
            for (Entry<String, List<String>> 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响应头总是空的。

如何archieve这个任何想法? 我们的目标是要能够存储在数据库中的完整的HTTP请求和响应。

谢谢!!

Answer 1:

您也可以尝试

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

我假设你从某种类型的Java EE应用服务器中(而不是从一个独立的客户端)提供Web服务。 你不能访问Java EE基础设施一样HttpServletRequestHttpServletResponse网页/ Java EE容器的上下文之外。

你可以尝试以获得实际的servlet响应对象在你的手中(一个网络环境中)与

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

我严重怀疑你将能够处理程序中让您的双手全响应头,虽然。 你的问题很好奇我和我花了相当长的一段时间来研究的那部分。 在所有的示例代码我见过,甚至没有例如在该地铁工地试图实现这个功能,我认为原因很简单。 如在其中处理程序被调用的点中,容器可能没有足够的信息确定的邮票上的出站消息的HTTP标头。 你也许可以添加东西,但是这是值得怀疑的为好。



文章来源: Log jax-ws http request and response