Configurer JVM / JRE pour utiliser Windows Proxy automatiquement

j'ai vu la question de définir le proxy pour la JVM mais ce que je veux demander c'est comment on peut utiliser le proxy qui est déjà configuré (sous Windows).

Voici une démonstration de mon problème:

  1. allez dans votre Panneau de configuration->Java et définissez une adresse proxy.
  2. exécutez le code applet simple suivant (j'utilise L'IDE Eclipse):
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);
    }
}

l'Applet affiche "NONE" sans tenir compte des paramètres que vous avez placés dans le Panneau de configuration Java. Ce qui serait le mieux si les paramètres proxy de Windows (habituellement définis dans Internet Explorer) étaient ce que je pouvais déterminer, mais faire une étape de configuration supplémentaire dans le Panneau de configuration Java resterait une solution acceptable.

Merci!

31
demandé sur t3rse 2008-12-18 00:32:21

5 réponses

il est possible de détecter le proxy en utilisant le ProxySelector classe et de lui attribuer le système de proxy par l'affectation de variables d'environnement avec l' méthode setProperty de la classe système:

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()));
        }
    }
}
38
répondu t3rse 2015-03-03 08:58:14

j'ai trouvé un comportement étrange expérimentant avec le code suggéré ici.

il semble que, après qu'un ProxySelector par défaut ait été configuré, le code de socket régulier (par exemple la création d'une nouvelle Socket) ne fonctionne plus, parce qu'il essaie d'utiliser un serveur de socks (Je ne sais pas pourquoi il ferait cela, mais pour moi il le fait).

donc si vous, en appelant

Socket socket = new Socket(host, port);

vous recevez une telle exception 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)

alors essayez de définir le ProxySelector par défaut null:

ProxySelector.setDefault(null);

Pour moi, cela a entraîné la petite classe Java que j'utilise tout simplement de récupérer les systèmes paramètres de proxy sans affecter l'utilisation de Sockets() de l'application, et pourtant le système est configuré correctement pour utiliser le proxy:

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;
  }
}
10
répondu Flo 2011-08-16 21:43:09

Cela peut être un peu tard, mais je rencontre le même problème. La façon dont je l'ai réparé utilise-Djava.net.useSystemProxies=true as jvm arguments.

"notez que cette propriété n'est cochée qu'une seule fois au démarrage."

cette propriété est définie au démarrage de sorte qu'elle ne changera pas lorsque vous lancerez votre application.

j'espère que cela aidera.

Référence: https://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html

6
répondu Juan Martin Lichowski 2015-12-10 14:53:04

java.net.URL.openStream() est un raccourci pour java.net.URL.openConnection().getInputStream().

4
répondu Hrvoje 2011-12-28 16:31:35

mise à jour: vous avez besoin d'avoir le Système de la Propriété java.net.useSystemProxies true pour que ma solution ci-dessous fonctionne.

Si vous utilisez java.net.URL.openStream() pour obtenir un InputStream pour le contenu de la ressource Web, vous obtenez automatiquement le même proxy utilisé Qu'Internet Explorer utiliserait pour cette URL.

pas besoin d'aller dans le Panneau de contrôle Java ou d'afficher le proxy utilisé.

2
répondu Alain O'Dea 2015-06-08 17:09:37