[英]Log jax-ws http request and response
我需要在JAX-WS WebService调用中记录完整的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响应标头始终为空。
关于如何实现这一点的任何想法? 目标是能够在数据库中存储完整的http请求和响应。
谢谢!!
你也可以试试
-Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true
我假设您从某种Java EE应用程序服务器(而不是来自独立客户端)提供Web服务。 您无法在Web / Java EE容器的上下文之外访问Java EE基础结构,如HttpServletRequest
和HttpServletResponse
。
您可以尝试使用实际的servlet响应对象(在Web上下文中)
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标头。 你可能能够添加东西,但这也是值得怀疑的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.