web-dev-qa-db-fra.com

Configuration de JVM / JRE pour utiliser automatiquement le proxy Windows

J'ai vu la question sur la configuration du 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. Accédez à votre Panneau de configuration-> Java et définissez une adresse proxy.
  2. Exécutez le code d'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 "AUCUN" sans tenir compte des paramètres que vous avez placés dans le panneau de configuration Java. Ce qui serait mieux si les paramètres du proxy Windows (généralement définis dans Internet Explorer) étaient ce que Je pourrais déterminer mais faire une étape de configuration supplémentaire dans le Java Control Panel serait toujours une solution acceptable.

Merci!

31
t3rse

Il est possible de détecter le proxy à l'aide de la classe ProxySelector et d'affecter le proxy système en affectant des variables d'environnement avec la méthode setProperty de la classe 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()));
        }
    }
}
38
t3rse

J'ai trouvé un comportement étrange en expérimentant le code suggéré ici.

Il semble que, après la définition d'un ProxySelector par défaut, le code de socket normal (par exemple, la création d'un nouveau socket) ne fonctionne plus, car il essaie d'utiliser un serveur de chaussettes (je ne sais pas pourquoi il le ferait, mais pour moi, c'est le cas) .

Donc si vous appelez

Socket socket = new Socket(Host, port);

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

puis essayez de redéfinir le ProxySelector par défaut sur null:

ProxySelector.setDefault(null);

Pour moi, cela a abouti à la petite classe Java Java que j'utilise maintenant pour récupérer simplement les paramètres de proxy du système sans que cela n'affecte l'utilisation ultérieure de Sockets () de l'application, tout en configurant le système 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
Flo

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

"Notez que cette propriété n'est vérifiée qu'une seule fois au démarrage."

Cette propriété est définie au démarrage, elle ne changera donc pas lorsque vous exécutez votre application.

J'espère que ça aide.

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

9

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

4
Hrvoje

MISE À JOUR: vous devez avoir la propriété système Java.net.useSystemProxies définie sur 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 que celui utilisé par Internet Explorer pour cette URL.

Pas besoin d'aller dans le Java Control Panel ou d'afficher le proxy utilisé.

2
Alain O'Dea
try{
    System.setProperty("Java.net.useSystemProxies", "true");
    String prx = ProxySelector.getDefault().select(new URI("http://www.google.com")).get(0).address().toString();
    JOptionPane.showMessageDialog(null, prx);
} catch(Exception e){
    JOptionPane.showMessageDialog(null, "no proxy");
}
1
Mahdi