Как включить провод, регистрирующийся для трафика java HttpURLConnection?

Я имел хороший успех и анализирующие и пишущие файлы CSV от Java с OpenCSV. Если Вы хотите прочитать или записать Excel совместимую электронную таблицу с Java, , библиотека POI от Apache является способом пойти.

44
задан Vadzim 9 June 2014 в 08:15
поделиться

5 ответов

Мне удалось зарегистрировать весь трафик SSL, реализовав мою собственную SSLSocketFactory поверх стандартной.

Это сработало для меня, потому что все наши подключения используют HTTPS, и мы можем установить фабрику сокетов с помощью метода HttpsURLConnection.setSSLSocketFactory .

Более полное решение, позволяющее осуществлять мониторинг всех сокетов, можно найти на http://www.javaspecialists.eu/archive/Issue169.html Спасибо Лоуренсу Долу для указания правильного направления использования Socket.setSocketImplFactory

Вот мой не готовый к производству код:

public class WireLogSSLSocketFactory extends SSLSocketFactory {

    private SSLSocketFactory delegate;

    public WireLogSSLSocketFactory(SSLSocketFactory sf0) {
        this.delegate = sf0;
    }

    public Socket createSocket(Socket s, String host, int port,
            boolean autoClose) throws IOException {
        return new WireLogSocket((SSLSocket) delegate.createSocket(s, host, port, autoClose));
    }

    /*
    ...
    */

    private static class WireLogSocket extends SSLSocket {

        private SSLSocket delegate;

        public WireLogSocket(SSLSocket s) {
            this.delegate = s;
        }

        public OutputStream getOutputStream() throws IOException {
            return new LoggingOutputStream(delegate.getOutputStream());
        }

        /*
        ...
        */

        private static class LoggingOutputStream extends FilterOutputStream {
            private static final Logger logger = Logger.getLogger(WireLogSocket.LoggingOutputStream.class);
            //I'm using a fixed charset because my app always uses the same. 
            private static final String CHARSET = "ISO-8859-1";
            private StringBuffer sb = new StringBuffer();

            public LoggingOutputStream(OutputStream out) {
                super(out);
            }

            public void write(byte[] b, int off, int len)
                    throws IOException {
                sb.append(new String(b, off, len, CHARSET));
                logger.info("\n" + sb.toString());
                out.write(b, off, len);
            }

            public void write(int b) throws IOException {
                sb.append(b);
                logger.info("\n" + sb.toString());
                out.write(b);
            }

            public void close() throws IOException {
                logger.info("\n" + sb.toString());
                super.close();
            }
        }
    }
}
16
ответ дан 26 November 2019 в 22:04
поделиться

Я не думаю, что вы можете сделать это автоматически, но вы можете создать подкласс FilterOutputStream и FilterInputStream с помощью HttpUrlConnection ' s выходные и входные потоки в качестве параметров. Затем, когда байты записываются / читаются, регистрировать их, а также передавать в базовые потоки.

2
ответ дан 26 November 2019 в 22:04
поделиться

Решение №1: Используйте шаблон декоратора

. Вам нужно будет использовать шаблон декоратора в классе HttpURLConnection чтобы расширить его функциональность. Затем переопределите все методы HttpURLConnection и делегируйте операцию указателю компонента, а также запишите необходимую информацию и запишите ее.

Также убедитесь, что вы переопределили родительский класс URLConnection.getOutputStream () : OutputStream и URLConnection.html # getInputStream () : InputStream методы для возврата декорированных объектов OutputStream и InputStream .

.

Решение №2: Используйте собственный HTTP-прокси в памяти

Напишите простой HTTP-прокси-сервер и запустите его в отдельном потоке во время запуска и инициализации приложения. См. Пример простого прокси-сервера .

Настройте свое приложение на использование указанного выше HTTP-прокси для всех ваших запросов. См. настройка Java для использования прокси .

Теперь весь ваш трафик проходит через прокси-сервер, как это происходит в скрипте. Следовательно у вас есть доступ к необработанному потоку http «от клиента к серверу», а также «обратно от сервера к клиенту». Вам придется интерпретировать эту необработанную информацию и при необходимости регистрировать ее.

Обновление: Использовать прокси-сервер HTTP в качестве адаптера к веб-серверу на основе SSL.

  == Client System =============================== 
  |                                              | 
  |    ------------------------------            | 
  |   |                              |           | 
  |   |    Java process              |           | 
  |   |                       ----   |           | 
  |   |        ----------    |    |  |           | 
  |   |       |          |    -O  |  |           | 
  |   |       |  Logging |        |  |           | 
  |   |       |   Proxy <---HTTP--   |    -----  | 
  |   |       |  Adapter |           |   |     | | 
  |   |       |  Thread o------------------>   | | 
  |   |       |        o |           |   |     | | 
  |   |        --------|-            |   | Log | | 
  |   |                |             |    -----  | 
  |    ----------------|-------------            | 
  |                    |                         | 
  =====================|========================== 
                       |                           
                       |                           
                     HTTPS                         
                      SSL                          
                       |                           
  == Server System ====|========================== 
  |                    |                         | 
  |    ----------------|----------------         | 
  |   |                V                |        | 
  |   |                                 |        | 
  |   |   Web Server                    |        | 
  |   |                                 |        | 
  |    ---------------------------------         | 
  |                                              | 
  ================================================ 
9
ответ дан 26 November 2019 в 22:04
поделиться

Как насчет использования AspectJ для вставки Pointcut, чтобы добавить рекомендации по ведению журнала вокруг метода? Я считаю, что AspectJ может вплести его в частные / защищенные методы.

Похоже, что sun.net.www.protocol.http.HttpURLConnection.writeRequest может вызывать sun.net.www.http.HttpClient.writeRequest, который принимает объект MessageHeader в качестве входных данных, так что это будет ваша цель.

В конце концов, это может сработать, но будет очень хрупким и будет работать только на Sun JVM; и на самом деле вы можете доверять только той версии, которую используете.

2
ответ дан 26 November 2019 в 22:04
поделиться

Если вас интересует только содержимое сети (заголовки, тело и т. Д.), Вы можете попробовать wirehark .

Это дает то преимущество, что вам не нужно изменять какой-либо код, хотя, если вы хотели включить ведение журнала через код, этот ответ неприменим.

2
ответ дан 26 November 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: