如何调试通过线路的所有内容(http)

时间:2014-10-15 10:10:08

标签: java debugging glassfish glassfish-4

我正在尝试在Glassfish 4中调试一些Rest服务,我想确切地看到通过网络发送的内容(HTTP连接)。有没有办法让Glassfish打印出来?

我的项目使用Apache HTTP Client,我知道可以在那里配置它,但我无法使用我们的日志框架(java.util.logging)。

编辑:或者有没有办法调试泽西岛,它会打印出这个信息?

6 个答案:

答案 0 :(得分:8)

您没有指定是否可以控制客户端/前端,或者是否只是在后端。

想到一些直接的想法:

  1. 使用像WireShark这样的数据包嗅探器/分析器(如已建议的那样)。效果很好,唯一的问题是可能产生的数据远远超过你真正希望看到/分析的数据。

  2. 使用CharlesFiddler等代理。这些可以配置为显示/记录您想要/需要的数据。缺点是它们是代理(即:必须在您的连接中间),如果您将它放在服务器前面,这可能会导致配置困难。通常在客户端更容易配置,只需通过它推送客户端流量。 Fiddler是免费的,但只有基于Windows的版本(适用于Mac和Linux的alpha版本)。查尔斯有一个试用版,或者是50美元(如果内存服务)。我也不知道Fiddler和/或Charles是否会以无头模式运行。

  3. 设置您自己的Http代理服务器并通过那里记录所有内容。这不是一个理想的解决方案,但也是一个选择。

  4. 在您的应用程序中添加一个过滤器,以记录进/出的所有HTTP数据,但这会变得棘手/混乱,并且传入的Http请求主体是单读的,因此需要为多次读取/访问缓存它们(请参阅Http Servlet request lose params from POST body after read it oncehttps://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)

如果您有权访问该代码,您可以:

  1. 更新您的日志记录以从HTTP客户端打印信息。
  2. 添加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);
    }
    

    }

  3. 并使用以下内容,或类似于this

答案 5 :(得分:0)

如果您想从REST客户端代码角度吐出请求和响应,请使用com.sun.jersey.api.client.filter.LoggingFilter的客户端日志记录可能会有所帮助。