2012-04-25 15 views
16

Quiero que mi programa Java use la configuración del proxy del sistema. En consecuencia, utilicé el código que se encuentra en muchos lugares, como this answer, para establecer java.net.useSystemProxies en verdadero y llamo al ProxySelector.getDefault().select(...) para descubrir el proxy para el host particular que quiero alcanzar. Esto funciona bien cuando configuro un único servidor proxy explícito en Propiedades de Internet. Pero si configuré "Usar script de configuración automática", siempre devuelve el "proxy" DIRECTO.¿ProxySelector de Java no funciona con scripts de configuración automática de proxy?

Sé que el script funciona, ya que mi navegador puede acceder a los hosts para los que devuelve un servidor proxy, y sin el conjunto de scripts, no puede. Incluso he intentado simplificar el guión a sus elementos más esenciales:

function FindProxyForURL(url, host) 
{ 
    return "PROXY my.proxy.mydomain:3128"; 
} 

y funciona en mi navegador, pero todavía ProxySelector.getDefault().select(...) devuelve sólo DIRECTO.

¿Echo de menos algo? (Esto es en Java 1.6 & Windows 7, en caso de que importe.)

Respuesta

26

No, Java ProxySelector no lee Proxy Auto-Config (PAC) archivos.

Sin embargo, as suggested by Brian de Alwis como una respuesta a mi pregunta similar, la biblioteca Proxy Vole parece proporcionar ese apoyo/capacidad.

Para proporcionar conectividad de red lista para utilizar para la aplicación Java , puede utilizar la biblioteca Proxy - Vole. Proporciona algunas estrategias para detectar automáticamente la configuración de proxy actual. Hay muchas estrategias configurables para elegir. En este momento Proxy - Vole admite las siguientes estrategias de detección de proxy.

  • Leer configuración de la plataforma (Apoyos: de Windows, KDE, Gnome, OSX)
  • Ajuste de la lectura del navegador (soporta: 3.x Firefox, Internet Explorer, Chrome y Webkit utilizan la configuración de la plataforma)
  • Leer Medio Ambiente (variables de frecuencia utilizados en los sistemas de servidores Linux/Unix)
  • script de detección automática mediante WPAD/PAC (No todas las variaciones compatibles)
+1

Gracias por el consejo. Buscar en Google para "selector de proxy de Java" no encuentra esta biblioteca, a menos que sea lo suficientemente agudo como para darse cuenta de que algunos de los fragmentos de código que pasan son parte de una biblioteca útil. Es una pena que Java ya no lo haga por sí mismo, ya que tiene la estructura ProxySelector y sabe cómo encontrar un proxy fijo ordinario. – vanmelle

+2

Por cierto, las instrucciones son un poco engañosas, ya que la configuración "predeterminada" es inútil: utiliza la estrategia "leer las propiedades del sistema Java", que es lo que obtendría sin esta biblioteca en la primera lugar. Lo que funcionó para mí fue ProxySearch proxySearch = new ProxySearch(); proxySearch.addStrategy (Strategy.OS_DEFAULT); myProxySelector = proxySearch.getProxySelector(); – vanmelle

4

Podría cargar el archivo Proxy Auto-Config (PAC) en Java. Por favor, consulte los códigos y el paquete a continuación. espero que esto sería lo que estaba buscando:

import com.sun.deploy.net.proxy.*; 
. 
. 
BrowserProxyInfo b = new BrowserProxyInfo();   
b.setType(ProxyType.AUTO); 
b.setAutoConfigURL("http://yourhost/proxy.file.pac");  
DummyAutoProxyHandler handler = new DummyAutoProxyHandler(); 
handler.init(b); 

URL url = new URL("http://host_to_query"); 
ProxyInfo[] ps = handler.getProxyInfo(url);  
for(ProxyInfo p : ps){ 
    System.out.println(p.toString()); 
} 

Ya tiene un paquete de [com.sun.deploy.net.proxy] en su máquina! Buscar [deploy.jar]; D

+0

¿Qué es DummyAutoProxyHandler? – sscarduzio

11

Como ya lo sugirió Mads Hansen, Proxy-Vole hace el truco!

Sólo tiene que añadir el frasco del sitio de descargas de la ruta de clases (DLL se incluyen) y este código me ayudaron a configurar los stettings de proxy:

ProxySearch proxySearch = new ProxySearch(); 
proxySearch.addStrategy(Strategy.OS_DEFAULT); 
proxySearch.addStrategy(Strategy.JAVA); 
proxySearch.addStrategy(Strategy.BROWSER); 
ProxySelector proxySelector = proxySearch.getProxySelector(); 

ProxySelector.setDefault(proxySelector); 
URI home = URI.create("http://www.google.com"); 
System.out.println("ProxySelector: " + proxySelector); 
System.out.println("URI: " + home); 
List<Proxy> proxyList = proxySelector.select(home); 
if (proxyList != null && !proxyList.isEmpty()) { 
for (Proxy proxy : proxyList) { 
    System.out.println(proxy); 
    SocketAddress address = proxy.address(); 
    if (address instanceof InetSocketAddress) { 
    String host = ((InetSocketAddress) address).getHostName(); 
    String port = Integer.toString(((InetSocketAddress) address).getPort()); 
    System.setProperty("http.proxyHost", host); 
    System.setProperty("http.proxyPort", port); 
    } 
} 
} 
+1

su código funciona muy bien, gracias. Simplemente una sugerencia menor - 3ra línea debe ser 'proxySearch.addStrategy (Strategy.JAVA);' – vishesh

+0

Gracias vishesh. Simplemente corrigió el error tipográfico :) – deradam

+0

El código no funciona para mí :( Obtengo NullPointerException en la lista de la línea proxyList = proxySelector.select (home); proxySelector es nulo y si miras el cuerpo getProxySelector(), podrás ver que siempre devuelve null. – Suspended

1

Puede utilizar proxy Vole para resolver este problema :

Si usted sabe exactamente lo que PAC-archivo que desea utilizar, puede hacerlo:

UrlPacScriptSource source = new UrlPacScriptSource("http://www.example.org/proxy.pac"); 
PacProxySelector selector = new PacProxySelector(source); 

ProxySelector.setDefault(selector); 

La ventaja de esto es que no es relacionada con el usuario. Por ejemplo, si ejecuta esto como un servicio de Windows, puede terminar ejecutándolo en el usuario del SISTEMA que puede no tener la misma configuración de proxy OS_DEFAULT (si corresponde) como usuario administrador.

El método que utiliza los valores del sistema/software es:

ProxySearch proxySearch = new ProxySearch(); 
proxySearch.addStrategy(Strategy.OS_DEFAULT); 
proxySearch.addStrategy(Strategy.BROWSER); 
proxySearch.addStrategy(Strategy.JAVA); 
ProxySelector proxySelector = proxySearch.getProxySelector(); 

ProxySelector.setDefault(proxySelector); 

Esto comienza con OS_DEFAULT, entonces JAVA y por último BROWSER como estrategias para el selector de proxy.

Este código está basado en el código de GitHub, lanzamiento de la versión 1.0.3.

Cuestiones relacionadas