Мне нужно автоматически определить, требуется ли пользователю прокси-сервер для доступа в Интернет. Есть ли способ, которым приложение Java может читать настройки прокси-сервера?
Спасибо, Джимми
Мне нужно автоматически определить, требуется ли пользователю прокси-сервер для доступа в Интернет. Есть ли способ, которым приложение Java может читать настройки прокси-сервера?
Спасибо, Джимми
Java SE 1.5 предоставляет класс ProxySelector для определения настроек прокси-сервера. Если есть прямое подключение к Интернету, тип прокси будет DIRECT else, он вернет хост и порт.
Пример ниже иллюстрирует эту функциональность:
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
public class TestProxy {
public static void main(String[] args) {
try {
System.setProperty("java.net.useSystemProxies","true");
List<Proxy> l = ProxySelector.getDefault().select(
new URI("http://www.yahoo.com/"));
for (Iterator<Proxy> iter = l.iterator(); iter.hasNext(); ) {
Proxy proxy = iter.next();
System.out.println("proxy hostname : " + proxy.type());
InetSocketAddress addr = (InetSocketAddress)proxy.address();
if(addr == null) {
System.out.println("No Proxy");
} else {
System.out.println("proxy hostname : " + addr.getHostName());
System.out.println("proxy port : " + addr.getPort());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
другой, принятый, ответ, несомненно, превосходный и правильный, но я думал, что добавлю что-то здесь...
Если вы находитесь на компьютере, настроенном на "параметры автоматического определения прокси-сервера", который, как мне кажется, называется PAC, код для обнаружить прокси в ответе, используя Java gubbins, не будет работать (он будет считать, что это "прямое" соединение).
Существует библиотека под названием прокси-полевка (новая лицензия BSD Я думаю), однако, что вы можете использовать вместо этого, поэтому здесь другой код ответа слегка изменен, чтобы использовать это:
public class testProxy {
public static void main(String[] args) {
try {
System.setProperty("java.net.useSystemProxies","true");
// Use proxy vole to find the default proxy
ProxySearch ps = ProxySearch.getDefaultProxySearch();
ps.setPacCacheSettings(32, 1000*60*5);
List l = ps.getProxySelector().select(
new URI("http://www.yahoo.com/"));
//... Now just do what the original did ...
for (Iterator iter = l.iterator(); iter.hasNext(); ) {
Proxy proxy = (Proxy) iter.next();
System.out.println("proxy hostname : " + proxy.type());
InetSocketAddress addr = (InetSocketAddress)
proxy.address();
if(addr == null) {
System.out.println("No Proxy");
} else {
System.out.println("proxy hostname : " +
addr.getHostName());
System.out.println("proxy port : " +
addr.getPort());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Он нуждается в этих импортах:
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import com.btr.proxy.search.ProxySearch;
О, и есть примеры использования для прокси-полевки здесь.