Настройка Eclipse, чтобы позволить Fiddler перехватывать запросы
В Eclipse есть два места, которые я попытался настроить, чтобы Fiddler мог перехватить запросы HTTP/HTTPS, которые я отправляю:
-
Windows > Preference > General > Network Connections
- Я пробовал Native/Direct/Manual
- В аргументах VM я добавляю следующее
-DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888
EDIT: Я пробовал новые свойства, предлагаемые rgerganov.
Я не затрагивал никаких связанных с сетью настроек в Fiddler, и я установил его для мониторинга всех процессов.
Я попытался с Wireshark, и я смог перехватить запросы без каких-либо изменений в Eclipse, но информация, представленная в Wireshark, слишком глубока, и мне не нужна большая часть деталей, предоставленных Wireshark.
EDIT: Здесь пример кода, который я пытаюсь:
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.R35x
Fiddler2 v2.3.2.6
jdk1.6.0_21
Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация.
Ответы
Ответ 1
HttpClient
необходимо знать информацию прокси. Можно использовать несколько подходов:
См. 2.7 в компоненте HTTP документация:
-
"Подключиться к целевому хосту через прокси - установить параметр прокси-сервера по умолчанию"
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpHost proxy = new HttpHost("127.0.0.1", 8888);
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
-
Использование "стандартного селектора прокси 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
-
Пользовательская RoutePlanner
реализация (я не изучал эту опцию)
Ответ 2
У вас есть много возможностей настроить прокси-сервер в java:
- Использование свойств системы
- через аргументы VM (при условии, что вы хотите включить прокси для трафика 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");
"disavdantage" этого метода: как только прокси установлен для протокола, все соединение для этого протокола будет использовать прокси
-
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();
-
Класс 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 Java!
Важное замечание:
По умолчанию Fiddler фиксирует только трафик, поступающий от веб-браузеров!! Измените это, чтобы захватить трафик всех процессов: нижняя панель инструментов http://julien.comexis.eu/fiddler.jpg
Ответ 3
Второй метод должен работать, однако свойства http.proxyHost
и http.proxyPort
.
Ответ 4
Кроме того, в Fiddler, если вам нужно захватить все процессы из HTTPS-соединения, вам нужно перейти в меню "Инструменты" - "Параметры Fiddler" - HTTPS - проверить "Decrypt HTTPS traffic" и выбрать "... из всех процессов".
Выбор "Все процессы" из строки состояния Fiddler, по-видимому, предназначен только для HTTP-соединений.
Ответ 5
Можно использовать параметр JVM для прокси-хоста и прокси-порта. В то же время сертификат Fiddler должен быть установлен для соединений https сниффера.