Зарегистрировать все сетевые взаимодействия приложения Java

У меня есть чудовищное приложение Java (клиент малоизвестного сервера приложений GNUEnterprise) и его источник, который я могу скомпилировать после внесения в него некоторых изменений. Приложение сильно использует сеть, и мне нужно отслеживать каждый запрос и ответ. Я мог бы использовать sniffer, например Wireshark, но приложение работает со своим сервером через SSL, поэтому не зная секретный ключ SSL-сертификата, какой-либо обнюхивающий трафик довольно бесполезен.

Что я могу сделать, чтобы каждый запрос и ответ регистрировались из самого приложения? Мне нужно увидеть все отправленные и полученные заголовки. Я не хочу изменять весь код, ответственный за сетевое взаимодействие. Я хочу поставить код типа

Network.setDefaultLogger(myCustomLoggerInstance);

где-то рядом с приложением, а затем в myCustomLoggerInstance выполните все необходимые записи.

Кроме того, если все сетевые операции выполняются с помощью URLConnection s, я могу получить заголовки ответов с con.getHeaderFields() и запросить заголовки с con.getRequestProperties(). Но почему печенья там нет? Как сбрасывать отправленные и полученные файлы cookie таким же образом?

EDIT. То, что я пытаюсь достичь, - это имитировать связь RPC-приложения с сервером через SSL, скажем, с помощью curl. Для этого мне нужно получить подробный журнал сетевого трафика приложения.

Ответ 1

Нельзя использовать прокси-сервер регистрации, например. http://www.charlesproxy.com/ или http://fiddler2.com/? Charles Proxy также может декодировать запросы AMF, Fiddler является чемпионом для перехвата SSL.

IIRC вы можете установить системные свойства http.proxyHost и http.proxyPort на 127.0.0.1 и 8888, а java URLConnections будет автоматически подключаться через ваш прокси-сервер регистрации, и вы получите хорошее представление о своем HTTP-трафике.

Или, если намерение состоит в том, чтобы иметь возможность воспроизвести сообщение, используйте JMeter HTTP Proxy, это записи в формате, который подходит для воспроизведения. Он также имеет встроенную поддержку обработки файлов cookie.

Если приложение использует хорошие веб-службы, SoapUI также имеет прокси-сервер мониторинга, который перехватывает вызовы веб-сервисов, для которых вы импортировали WSDL.

Ответ 2

Быстрый способ регистрации всего трафика SSL - запустить java с помощью:

-Djavax.net.debug=all

Или установите его как системное свойство:

System.setProperty("javax.net.debug","all");

Подцепите себя. Если вы сделаете это, стандартное извещение получит NOISY!

(* Примечание: регистрируются только трафик SSL и информация об отладке SSL (рукопожатия и т.д.). Регулярные сокеты не регистрируются.)

Ответ 3

Я просто хочу опубликовать фрагмент кода, который вы можете использовать в начальной точке. У меня нет "глобального" регистратора, но с небольшими изменениями в существующем коде вы можете достичь своей цели. Я "лог" на стандартный вывод, так как ваша проблема может быть разделена на две части: получение информации из UrlConnection и сохранение ее для дальнейшей справки.

Этот код регистрирует запрос:

public class URLConnectionReader {

  public static void main(String[] args) throws Exception {
  URL oracle = new URL("http://www.google.com/");
  URLConnection yc = oracle.openConnection();

  String headerName = null;
  for (int i = 1; (headerName = yc.getHeaderFieldKey(i)) != null; i++) {
    if (headerName.equals("Set-Cookie")) {
      String cookie = yc.getHeaderField(i);
      System.out.println("Cookie  ::  " + cookie);
    } else {
      System.out.println("Header: "+ yc.getHeaderField(i));
    }
  }

  BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
  String inputLine;
  while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);
  in.close();
}

}

сохранение всех этих данных в один или несколько файлов не сложно. Если вы считаете, что я на правильном пути для вас, я был бы рад отредактировать ответ с другими деталями по мере необходимости.

Ответ 4

Я вырыл немного дальше, и, по-видимому, HttpURLConnection поставляется с включенным java.util.logging по умолчанию.

См. связанные вопросы: Java: Показать запрос HttpURLConnection перед отправкой и Как включить ведение журнала проводки для трафика httpURLCLConnation java?

Java.util.logging была попыткой Sun (неудачно) стандартизировать поставщиков протоколирования в Java 1.4. Вы можете подключить его к SLF4J через модуль jul-to-slf4j, если вы хотите избежать настройки свойств системы.

Но я все же предпочел бы прокси Fiddler или JMeter, хотя: -)

Ответ 5

Если вы хотите регистрировать сетевой трафик, и у вас есть объекты URLConnection, проблема уже решена!
Если вы хотите регистрироваться на уровне потока, вам нужно написать небольшую обертку поверх ваших потоков ввода-вывода и записать все данные, прежде чем переносить их на более низкие сетевые уровни, в противном случае вы можете напрямую использовать объекты подключения для получения требуемой информации и их регистрации.
Для управления кукисами вы должны использовать java.net.HttpCookie, который вводится в java 6. Единственное, что вам нужно сделать, это создать экземпляр CookieManager и установить его как менеджера файлов cookie по умолчанию:

CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);

& вы можете использовать его для управления файлами cookie!