2008-12-17 19 views
29

Vi la pregunta sobre la configuración del proxy para JVM, pero lo que quiero preguntar es cómo se puede utilizar el proxy que ya está configurado (en Windows).Configuración de JVM/JRE para usar Windows Proxy Automáticamente

Aquí es una demostración de mi problema:

  1. Vaya a su Panel de control-> Java y configurar una dirección de proxy.
  2. ejecute el siguiente código simple applet (estoy usando el 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); 
    } 
} 

El applet muestra "NINGUNO" sin tener en cuenta los ajustes que ha colocado en el Java Panel de control. Lo mejor sería si la configuración proxy de Windows (generalmente configurada en Internet Explorer) fuera lo que yo pudiera determinar, pero realizar un paso de configuración adicional en el Panel de control de Java sería una solución aceptable.

Gracias!

Respuesta

37

Es posible detectar el proxy utilizando la clase ProxySelector y asignar el servidor proxy del sistema mediante la asignación de variables de entorno con el 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

tengo proxy en aquí. Pero este fragmento de código imprime "proxy de detección proxy nombre de host: DIRECTO Sin proxy" pero en realidad la conexión al URI especificado falla con el tiempo de espera. –

+0

proxy nombre de host: DIRECTO Sin proxy ¿Esto significa que no estoy detrás de un proxy? –

+2

misma situación, estoy detrás de un proxy pero esto me da DIRECTO Sin proxy usando este código ... – splinter123

2

ACTUALIZACIÓN: es necesario tener la propiedad del sistema java.net .useSystemProxies establecido en verdadero para que mi solución a continuación funcione.

Si usa java.net.URL.openStream() para obtener un InputStream para el contenido de recursos web, automáticamente obtendrá el mismo proxy que Internet Explorer usaría para esa URL.

No es necesario ir al Panel de control de Java o mostrar el proxy utilizado.

+2

No, eso no es cierto. O si se supone que funciona de esa manera, no funciona. – mmo

+0

@mmo estás en lo correcto. Gracias por identificar eso. Estaba usando java.net.useSystemProxies y olvidé mencionar eso. Es un punto esencial. –

+0

@mmo ¿He tratado su preocupación lo suficiente como para que elimine el voto en negativo? –

4

java.net.URL.openStream() es una abreviatura de java.net.URL.openConnection().getInputStream().

10

Encontré un comportamiento extraño experimentar con el código sugerido aquí.

Parece que, después de establecer un ProxySelector predeterminado, el código de socket normal (por ejemplo, crear un nuevo Socket) ya no funciona, porque intenta usar un servidor de calcetines (no estoy seguro de por qué lo haría, sino yo lo hago).

Así que si, al llamar

Socket socket = new Socket(host, port); 

recibe un SocketException tales:

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) 

intente ajustar las ProxySelector predeterminado a nulo:

ProxySelector.setDefault(null); 

Para mí esto resultó en la siguiente pequeña clase de Java que ahora uso para recuperar la configuración de proxy del sistema con sin tener que afecta el uso adicional de sockets() de la aplicación, sin embargo, la configuración del sistema correctamente para utilizar el 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

Esto podría ser un poco tarde, pero me encuentro con el mismo problema. La forma en que lo arreglé es usando -Djava.net.useSystemProxies = verdadero como argumentos jvm.

"Tenga en cuenta que esta propiedad se comprueba solo una vez en el inicio".

Esta propiedad está configurada en el inicio, por lo que no cambiará cuando ejecute la aplicación.

Espero que esto ayude.

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

+1

+1 por mencionar que esta propiedad solo se verifica una vez al inicio, algo que no se menciona en ninguna otra parte de esta pregunta. – fragorl

+0

¡En realidad, si se especifica esta propiedad, el proxy del sistema se usa automáticamente! – MauganRa

Cuestiones relacionadas