Настройка Eclipse, чтобы позволить Fiddler перехватывать запросы - PullRequest
11 голосов
/ 14 марта 2011

В Eclipse есть два места, которые я пытался настроить, чтобы Fiddler мог перехватывать отправляемые мной HTTP / HTTPS-запросы:

  1. Windows > Preference > General > Network Connections - я пробовалСобственный / Прямой / Ручной
  2. В аргументах виртуальной машины я добавляю следующее -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888

РЕДАКТИРОВАТЬ: я также пробовал новые свойства, предложенные rgerganov.

Я не затрагивал никаких настроек, связанных с «сетью» в Fiddler, и настроил его для мониторинга всех процессов.

Я пытался использовать Wireshark и смог перехватить запросы без изменений в Eclipse, ноинформация, представленная в Wireshark, является слишком глубокой, и мне не нужно большинство деталей, предоставляемых Wireshark.

РЕДАКТИРОВАТЬ: Вот пример кода, который я пытаюсь:

public static void doPOST() {
    String post_url = "https://lookup.mxtelecom.com/USLookup";

    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion( params, HttpVersion.HTTP_1_1 );
    HttpProtocolParams.setContentCharset( params, "UTF-8" );
    HttpProtocolParams.setUseExpectContinue( params, true );

    SchemeRegistry supportedSchemes = new SchemeRegistry();
    supportedSchemes.register( new Scheme( "https", SSLSocketFactory.getSocketFactory(), 443 ) );
    supportedSchemes.register( new Scheme( "http", PlainSocketFactory.getSocketFactory(), 80 ) );

    ClientConnectionManager ccm = new ThreadSafeClientConnManager( params, supportedSchemes );
    HttpClient m_Client = new DefaultHttpClient( ccm, params );

    HttpPost httpPost = new HttpPost( post_url );

    List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
    postParameters.add( new BasicNameValuePair( "something", "useful" ) );

    ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
      @Override
      public String handleResponse( HttpResponse response ) throws ClientProtocolException, IOException {
        if ( response.getEntity() != null ) {
          return EntityUtils.toString( response.getEntity() );
        }

        return null;
      }
    };

    try {
      UrlEncodedFormEntity entity = new UrlEncodedFormEntity( postParameters, "UTF-8" );
      httpPost.setEntity( entity );
      results = m_Client.execute( httpPost, responseHandler );

    } catch ( ClientProtocolException e ) {
      e.printStackTrace();
    } catch ( IOException e ) {
      e.printStackTrace();
    }
  }

Eclipse Build id: 20100218-1602 // 3.5.2.R35xFiddler2 v2.3.2.6jdk1.6.0_21

Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация.

Ответы [ 5 ]

16 голосов
/ 30 марта 2011

HttpClient необходимо знать о прокси-информации. Можно использовать несколько подходов:

См. 2.7 в документации компонента HTTP :

  1. "Подключиться к целевому хосту через прокси, установив параметр прокси по умолчанию"

    DefaultHttpClient httpclient = new DefaultHttpClient();
    
    HttpHost proxy = new HttpHost("127.0.0.1", 8888);
    
    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
    
  2. Использование «стандартного селектора прокси JRE для получения информации прокси»

    DefaultHttpClient httpclient = new DefaultHttpClient();
    
    ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
                httpclient.getConnectionManager().getSchemeRegistry(), ProxySelector.getDefault());
    
    httpclient.setRoutePlanner(routePlanner);
    

    , а затем добавить в качестве аргументов VM следующее:

    -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8888
    
  3. Пользовательская RoutePlanner реализация (я не исследовал эту опцию)

5 голосов
/ 29 марта 2011

У вас есть много возможностей настроить прокси в Java:

  1. Использование системных свойств
    • через аргументы виртуальной машины (при условии, что вы хотите включить прокси для трафика http и https):

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8888

  • через Свойства системы:

    // Get system properties
    Properties sysProperties = System.getProperties();
    // Specify proxy settings
    sysProperties.put("https.proxyHost", "127.0.0.1");
    sysProperties.put("https.proxyPort", "8888");
    sysProperties.put("http.proxyHost", "127.0.0.1");
    sysProperties.put("http.proxyPort", "8889");   
    

Отключение этого метода: как только прокси-сервер настроен для протокола, все соединения для этого протокола будут использовать прокси

  1. java.net.Proxy: доступно с версии Java 1.5. Позволяет вам указать конфигурацию прокси, чтобы использовать для открытия соединения

    SocketAddress addr = new  InetSocketAddress("127.0.0.1", 8888);
    Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
    URL url = new URL("http://stackoverflow.com/");
    InputStream in = url.openConnection(proxy).getInputStream();
    
  2. Класс ProxySelector: доступен начиная с Java 1.5. позволяют выбрать прокси по URI! Это абстрактный класс, простая реализация, возвращающая ваш прокси для всех соединений http и https, выглядит следующим образом:

    public static class MyProxySelector extends ProxySelector {
        private List<Proxy> proxy;
        private List<Proxy> noProxy;
    
        MyProxySelector() {
            proxy = new ArrayList<Proxy>();
            SocketAddress addr = new  InetSocketAddress("127.0.0.1", 8888);
            proxy.add(new Proxy(Proxy.Type.HTTP, addr));
    
            noProxy = new ArrayList<Proxy>();
            noProxy.add(Proxy.NO_PROXY);
        }
    
        public List<Proxy> select(URI uri) {
            System.err.println("Connection to the proxy for uri :"+uri);
            if (uri == null) {
                throw new IllegalArgumentException("URI can't be null.");
            }
            String protocol = uri.getScheme();
    
            if ("http".equalsIgnoreCase(protocol) || "https".equalsIgnoreCase(protocol)) {
                //if http or https connection, return our proxy config
                return proxy;
            } else {
                // Otherwise don't use a proxy
                return noProxy;
            }
        }
    
        @Override
        public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
            System.err.println("Connection to the proxy failed !");
            //throw exception or do some stuff...
        }
    }
    

И установите ваш селектор прокси как селектор прокси по умолчанию

    public static void main(String[] args){
     ProxySelector.setDefault(new MyProxySelector());
     //...
    }

Я предпочитаю этот последний механизм, потому что вы можете поставить некоторые записи и посмотреть, что делает Java!

Важное замечание:

По умолчанию Fiddler захватывает только трафик, поступающий из веб-браузеров !! Измените это для захвата трафика всех процессов: нижняя панель инструментов http://julien.comexis.eu/fiddler.jpg

2 голосов
/ 21 февраля 2012

Кроме того, в Fiddler, если вам нужно захватить все процессы из соединения HTTPS, вам нужно перейти в меню «Сервис» - «Параметры Fiddler» - HTTPS - проверить «Дешифровать трафик HTTPS» и выбрать «... из всех процессов». ».

Выбор «Все процессы» в строке состояния Fiddler, по-видимому, только для HTTP-соединений.

2 голосов
/ 15 марта 2011

Второй метод должен работать, однако свойства http.proxyHost и http.proxyPort.

1 голос
/ 04 февраля 2014

Можно использовать параметр JVM прокси-хоста и прокси-порта.В то же время необходимо установить сертификат Fiddler для перехвата соединений https.

...