Зарегистрировать все сетевые взаимодействия приложения 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!