Настройка JVM / JRE для автоматического использования Windows Proxy

Я видел вопрос о настройке прокси для JVM, но я хочу спросить, как можно использовать уже настроенный прокси (в Windows).

Вот демонстрация моей проблемы:

Зайдите в вашу Панель управления-> Java и установите адрес прокси.Запустите следующий простой код апплета (я использую Eclipse IDE):
import java.awt.Graphics;
import javax.swing.JApplet;
import java.util.*;

public class Stacklet extends JApplet {
    private String message;
    public void init(){
        Properties props = System.getProperties();
        message = props.getProperty("http.proxyHost", "NONE");      
        message = (message.length() == 0)? "NONE": message;
    }

    public void paint(Graphics g)
    {
        g.drawString(message, 20, 20);
    }
}

Апплет отображает «НЕТ» независимо от настроек, которые вы установили в панели управления Java. Лучше всего было бы, если бы я мог определить настройки прокси-сервера Windows (обычно устанавливаемые в Internet Explorer), но выполнение дополнительного шага настройки в панели управления Java все равно было бы приемлемым решением.

Спасибо!

Ответы на вопрос(2)

Решение Вопроса

Можно определить прокси с помощьюProxySelector класс и назначить системный прокси, назначив переменные среды сМетод setProperty класса System:

System.setProperty("java.net.useSystemProxies", "true");
System.out.println("detecting proxies");
List l = null;
try {
    l = ProxySelector.getDefault().select(new URI("http://foo/bar"));
} 
catch (URISyntaxException e) {
    e.printStackTrace();
}
if (l != null) {
    for (Iterator iter = l.iterator(); iter.hasNext();) {
        java.net.Proxy proxy = (java.net.Proxy) iter.next();
        System.out.println("proxy type: " + proxy.type());

        InetSocketAddress addr = (InetSocketAddress) proxy.address();

        if (addr == null) {
            System.out.println("No Proxy");
        } else {
            System.out.println("proxy hostname: " + addr.getHostName());
            System.setProperty("http.proxyHost", addr.getHostName());
            System.out.println("proxy port: " + addr.getPort());
            System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));
        }
    }
}
 Nikolay Kuznetsov05 нояб. 2012 г., 09:27
У меня есть прокси здесь. Но этот фрагмент кода выводит «имя хоста прокси-сервера для обнаружения прокси: DIRECT No Proxy», но на самом деле соединение с указанным URI не удается по истечении времени ожидания.
 Koray Tugay22 февр. 2014 г., 13:54
имя хоста прокси: ПРЯМОЙ Нет прокси Означает ли это, что я не за прокси?
 splinter12303 нояб. 2014 г., 16:46
та же ситуация, я за прокси-сервером, но я получаю ПРЯМОЙ без прокси с помощью этого кода ...

Я обнаружил странное поведение, экспериментирующее с предлагаемым кодом здесь.

Похоже, что после того, как был установлен ProxySelector по умолчанию, обычный код сокета (например, создание нового сокета) больше не работает, потому что он пытается использовать сервер socks (не уверен, почему он это сделает, но для меня это так) ,

Так что если вы при звонке

Socket socket = new Socket(host, port);

Вы получаете такое SocketException:

java.net.SocketException: Malformed reply from SOCKS server
    at java.net.SocksSocketImpl.readSocksReply(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)

затем попробуйте установить значение по умолчанию ProxySelector обратно в нуль:

ProxySelector.setDefault(null);

Для меня это привело к следующему небольшому классу Java, который я сейчас использую, чтобы просто получить настройки прокси-сервера системы, не влияя на дальнейшее использование Sockets () приложения, и в то же время правильно настроить систему для использования прокси:

public class ProxyConfig {

  private static String host;
  private static int port;

  public static void init() {
    System.setProperty("java.net.useSystemProxies", "true");
    Proxy proxy = getProxy();
    if (proxy != null) {
      InetSocketAddress addr = (InetSocketAddress) proxy.address();
      host = addr.getHostName();
      port = addr.getPort();

      System.setProperty("java.net.useSystemProxies", "false");
      System.setProperty("http.proxyHost", host);
      System.setProperty("http.proxyPort", ""+port);

    }
    System.setProperty("java.net.useSystemProxies", "false");
  }

  public static String getHost() {
    return host;
  }

  public static int getPort() {
    return port;
  }

  private static Proxy getProxy() {
    List<Proxy> l = null;
    try {
      ProxySelector def = ProxySelector.getDefault();

      l = def.select(new URI("http://foo/bar"));
      ProxySelector.setDefault(null);
    } catch (Exception e) {
      e.printStackTrace();
    }
    if (l != null) {
      for (Iterator<Proxy> iter = l.iterator(); iter.hasNext();) {
        java.net.Proxy proxy = iter.next();
        return proxy;
      }
    }
    return null;
  }
}

Ваш ответ на вопрос