2008-12-17 7 views
29

Ich habe die Frage über das Festlegen des Proxy für die JVM angezeigt, aber was ich fragen möchte ist, wie man den Proxy verwenden kann, der bereits konfiguriert ist (unter Windows). HierEinstellung von JVM/JRE für die automatische Verwendung von Windows Proxy

ist eine Demonstration meiner Frage:

  1. Gehen Sie zu Ihrem Systemsteuerung-> Java und eine Proxy-Adresse festgelegt.
  2. Führen Sie den folgenden einfachen Applet-Code (Ich bin das 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); 
    } 
} 

Das Applet zeigt "KEINE" ohne Rücksicht auf die Einstellungen, die Sie in der Java platziert haben Schalttafel. Am besten wäre es, wenn die Windows-Proxy-Einstellungen (normalerweise in Internet Explorer festgelegt) das sind, was ich feststellen könnte, aber ein zusätzlicher Konfigurationsschritt in der Java-Systemsteuerung wäre immer noch eine akzeptable Lösung.

Danke!

Antwort

37

Es ist möglich, den Proxy mit der ProxySelector Klasse zu erkennen und das System-Proxy zuweisen, indem der Zuweisung von Umgebungsvariablen mit den 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

ich Proxy tun haben hier drin. Aber dieser Teil des Codes druckt "Erkennung von Proxies Proxy Hostname: DIRECT Kein Proxy", aber tatsächlich Verbindung mit URI angegebenen fehlschlägt mit Timeout. –

+0

Proxy Hostname: DIRECT Kein Proxy Bedeutet dies, dass ich nicht hinter einem Proxy bin? –

+2

gleiche Situation, ich bin hinter einem Proxy, aber das bekomme ich DIREKT Kein Proxy mit diesem Code ... – splinter123

2

UPDATE: Sie benötigen die Systemeigenschaften haben java.net .useSystemProxies eingestellt auf wahr für meine Lösung unten zu arbeiten.

Wenn Sie java.net.URL.openStream() verwenden, um eine InputStream für den Inhalt der Webressource zu erhalten, erhalten Sie automatisch den gleichen Proxy, den Internet Explorer für diese URL verwenden würde.

Keine Notwendigkeit, in die Java-Systemsteuerung zu gehen oder den verwendeten Proxy anzuzeigen.

+2

Nein - das ist nicht wahr. Oder wenn es so funktionieren soll, funktioniert es nicht. – mmo

+0

@mmo du bist richtig. Danke, dass Sie das erkannt haben. Ich habe java.net.useSystemProxies benutzt und vergessen, das zu erwähnen. Es ist ein wesentlicher Punkt. –

+0

@mmo habe ich Ihre Bedenken ausreichend angesprochen, damit Sie den Downvote entfernen können? –

4

java.net.URL.openStream() ist eine Kurzschrift für java.net.URL.openConnection().getInputStream().

10

Ich habe ein seltsames Verhalten gefunden, hier mit dem vorgeschlagenen Code zu experimentieren.

Es scheint, dass nach dem Setzen eines Standard-ProxySelectors normaler Socket-Code (zB Erstellen eines neuen Sockets) nicht mehr funktioniert, weil er versucht, einen Socks-Server zu verwenden (nicht sicher, warum er dies tut, aber für mir tut es).

Also, wenn Sie, wenn

Socket socket = new Socket(host, port); 

rufen Sie eine solche Socket erhalten:

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) 

dann versuchen, die Standard-Proxyselector zurück auf null setzen:

ProxySelector.setDefault(null); 

Für mich dieser führte zu der folgenden kleinen Java-Klasse, mit der ich nun einfach die System-Proxy-Einstellungen abrufen kann aus, die es den weiteren Einsatz von Sockets() der Anwendung beeinflussen, noch die Konfiguration des Systems richtig den Proxy zu verwenden:

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

Dieses ein wenig spät sein könnte, aber ich laufe in das gleiche Problem. Die Art, wie ich es behoben habe, verwendet -Djava.net.useSystemProxies = true als jvm-Argumente.

"Beachten Sie, dass diese Eigenschaft nur einmal beim Start überprüft wird."

Diese Eigenschaft wird beim Start festgelegt und ändert sich nicht, wenn Sie Ihre Anwendung ausführen.

Ich hoffe, das hilft.

Referenz: https://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html

+1

+1 für erwähnen, dass diese Eigenschaft nur einmal beim Start überprüft wird, etwas, das nirgendwo sonst in dieser Frage erwähnt wird. – fragorl

+0

Eigentlich, wenn diese Eigenschaft angegeben ist, wird der System-Proxy automatisch verwendet! – MauganRa

Verwandte Themen