2008-12-17 6 views
29

J'ai vu la question concernant la configuration du proxy pour la JVM, mais je voudrais savoir comment utiliser le proxy déjà configuré (sous Windows).Configuration de JVM/JRE pour utiliser le proxy Windows automatiquement

Voici une démonstration de ma question:

  1. Accédez à votre Panneau de configuration> Java et définir une adresse proxy.
  2. Exécutez le code simple applet suivante (j'utilise l'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); 
    } 
} 

Le Applet affiche "NONE" sans tenir compte des paramètres que vous avez placé dans Java Panneau de contrôle. Ce qui serait le mieux serait si les paramètres de proxy Windows (généralement 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 serait toujours une solution acceptable.

Merci!

Répondre

37

Il est possible de détecter le proxy en utilisant la classe ProxySelector et attribuer le proxy du système en attribuant des variables d'environnement avec le setProperty method of the System class:

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())); 
     } 
    } 
} 
+4

J'ai procuration ici. Mais ce morceau de code imprime "détection des proxies nom d'hôte proxy: DIRECT No Proxy" mais la connexion à l'URI spécifiée échoue avec timeout. –

+0

nom d'hôte proxy: DIRECT No Proxy Est-ce que cela signifie que je ne suis pas derrière un proxy? –

+2

même situation, je suis derrière un proxy, mais cela je DIRECT pas de proxy en utilisant ce code ... – splinter123

2

MISE À JOUR: vous devez avoir la propriété système java.net .useSystemProxies mis à vrai pour ma solution ci-dessous pour travailler.

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 configuration Java ou d'afficher le proxy utilisé.

+2

Nope - ce n'est pas vrai. Ou si c'est supposé fonctionner comme ça, ça ne marche pas. – mmo

+0

@mmo vous avez raison. Merci d'avoir identifié cela. J'utilisais java.net.useSystemProxies et j'ai oublié de le mentionner. C'est un point essentiel. –

+0

@mmo ai-je suffisamment répondu à votre préoccupation pour que vous supprimiez le downvote? –

4

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

10

J'ai trouvé un comportement étrange expérimentant avec le code suggéré ici. Il semble qu'après avoir défini un ProxySelector par défaut, le code de socket standard (par exemple créer un nouveau Socket) ne fonctionne plus, car il essaie d'utiliser un serveur de socks (je ne sais pas pourquoi il le ferait, mais pour moi ça fait).

Donc, si vous, lorsque vous appelez

Socket socket = new Socket(host, port); 

vous recevez un tel 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 mettre le ProxySelector par défaut Retour null:

ProxySelector.setDefault(null); 

Pour moi, ce a abouti à la petite classe Java suivante que je utilise maintenant pour récupérer simplement les paramètres proxy du système avec à l'avoir une incidence sur la plus utilisation des sockets() de l'application, mais la configuration du 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; 
    } 
} 
5

Cela pourrait être un peu en retard, mais je tombe sur le même problème. La façon dont je l'ai réparée utilise -Djava.net.useSystemProxies = true comme arguments jvm.

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

Cette propriété est définie au démarrage afin qu'elle ne change pas lorsque vous exécutez votre application.

J'espère que cela aide.

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

+1

+1 pour mentionner que cette propriété n'est vérifiée qu'une seule fois au démarrage, ce qui n'est mentionné nulle part ailleurs dans cette question. – fragorl

+0

En fait, si cette propriété est spécifiée, le proxy système est utilisé automatiquement! – MauganRa

Questions connexes