我正在尝试在Glassfish 4中调试一些Rest服务,我想确切地看到通过网络发送的内容(HTTP连接)。有没有办法让Glassfish打印出来?
我的项目使用Apache HTTP Client,我知道可以在那里配置它,但我无法使用我们的日志框架(java.util.logging)。
编辑:或者有没有办法调试泽西岛,它会打印出这个信息?
答案 0 :(得分:8)
您没有指定是否可以控制客户端/前端,或者是否只是在后端。
想到一些直接的想法:
使用像WireShark这样的数据包嗅探器/分析器(如已建议的那样)。效果很好,唯一的问题是可能产生的数据远远超过你真正希望看到/分析的数据。
使用Charles或Fiddler等代理。这些可以配置为显示/记录您想要/需要的数据。缺点是它们是代理(即:必须在您的连接中间),如果您将它放在服务器前面,这可能会导致配置困难。通常在客户端更容易配置,只需通过它推送客户端流量。 Fiddler是免费的,但只有基于Windows的版本(适用于Mac和Linux的alpha版本)。查尔斯有一个试用版,或者是50美元(如果内存服务)。我也不知道Fiddler和/或Charles是否会以无头模式运行。
设置您自己的Http代理服务器并通过那里记录所有内容。这不是一个理想的解决方案,但也是一个选择。
在您的应用程序中添加一个过滤器,以记录进/出的所有HTTP数据,但这会变得棘手/混乱,并且传入的Http请求主体是单读的,因此需要为多次读取/访问缓存它们(请参阅Http Servlet request lose params from POST body after read it once和https://stackoverflow.com/a/17129256/827480以获得针对此问题的良好解决方案)
答案 1 :(得分:1)
您使用的是哪个http客户端版本?对于http客户端4,它位于log4j:
log4j.category.org.apache.http.wire=DEBUG
或者使用util日志记录:
org.apache.http.wire.level=FINEST
答案 2 :(得分:1)
通过使用过滤器,我们可以跟踪响应,在web.xml文件中添加此过滤器配置
<filter-mapping>
<filter-name>Test</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>Test</filter-name>
<filter-class>net.vsspl.Test</filter-class>
</filter>
过滤器calss是
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class Test implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
System.out.println("Status Code" + httpServletResponse.getStatus());
System.out.println("Name of the character encoding" + httpServletResponse.getCharacterEncoding());
System.out.println("Content type" + httpServletResponse.getContentType());
ArrayList<String> headers = (ArrayList<String>) httpServletResponse.getHeaderNames();
for (String header : headers) {
System.out.println(header + " Header value" + httpServletResponse.getHeader(header));
}
}
public void destroy() {}
}
答案 3 :(得分:1)
其他人建议使用wireshark,这是一个很好的工具,但使用起来有点麻烦。您通常必须捕获流量,将其传输到桌面,然后查看。
我最常用的工具是ngrep,它将tcpdump样式的数据包过滤器与数据包内容上的grep样式过滤器相结合,还有一个输出显示样式,足以调试大多数HTTP问题。
$ sudo ngrep -d tun0 '^(GET|POST|HEAD|HTTP)' port 80
interface: tun0 (10.104.1.6/255.255.255.255)
filter: (ip or ip6) and ( port 80 )
match: ^(GET|POST|HEAD|HTTP)
####
T 10.104.1.6:39700 -> 93.184.216.119:80 [AP]
GET / HTTP/1.1..User-Agent: Wget/1.14 (linux-gnu)..Accept: */*..Host: examp
le.com..Connection: Keep-Alive....
##
T 93.184.216.119:80 -> 10.104.1.6:39700 [A]
HTTP/1.1 200 OK..Accept-Ranges: bytes..Cache-Control: max-age=604800..Conte
nt-Type: text/html..Date: Fri, 24 Oct 2014 11:21:44 GMT..Etag: "359670651".
.Expires: Fri, 31 Oct 2014 11:21:44 GMT..Last-Modified: Fri, 09 Aug 2013 23
:54:35 GMT..Server: ECS (cpm/F9D5)..X-Cache: HIT..x-ec-custom-error: 1..Con
tent-Length: 1270....<!doctype html>.<html>.<head>. <title>Example Domai
n</title>.. <meta charset="utf-8" />. <meta http-equiv="Content-type"
content="text/html; charset=utf-8" />. <meta name="viewport" content="w
idth=device-width, initial-scale=1" />. <style type="text/css">. body
{. background-color: #f0f0f2;. margin: 0;. padding: 0
;. font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, san
s-serif;. . }. div {. width: 600px;. margin: 5em
auto;. padding: 50px;. background-color: #fff;. borde
r-radius: 1em;. }. a:link, a:visited {. color: #38488f;.
text-decoration: none;. }. @media (max-width: 700px) {. body
{. background-color: #fff;. }. div {.
width: auto;. margin: 0 auto;. border-radius: 0;.
padding: 1em;. }. }. </style> .</head>..<body>.<div
>. <h1>Example Domain</h1>. <p>This domain is established to be used
for il
我还建议使用http://www.brendangregg.com/Chaosreader/chaosreader0.94提供的名为chaosreader的更加模糊的工具。它将tcpdump文件转换为可浏览的html和其他文件集,以非常易于访问的形式显示所有流量。当你对网络通信的内容更感兴趣而不是分解成数据包时,要比wireshark容易得多。
答案 4 :(得分:0)
如果您有权访问该代码,您可以:
添加HTTP拦截器,如下所示:
public class HttpLogInterceptor extends HandlerInterceptorAdapter {
@Autowired
private RequestDumper requestDumper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
requestDumper.doLogRequest(request, response);
return true;
};
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
requestDumper.doLogResponse(request, response);
}
}
并使用以下内容,或类似于this:
答案 5 :(得分:0)
如果您想从REST客户端代码角度吐出请求和响应,请使用com.sun.jersey.api.client.filter.LoggingFilter的客户端日志记录可能会有所帮助。