¿Cómo hago que HttpURLConnection use un proxy?

136

Si hago esto ...

conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());

se imprime

Proxy? false

El problema es que estoy detrás de un proxy. ¿De dónde obtiene la JVM su información de proxy en Windows? ¿Cómo configuro esto? Todas mis otras aplicaciones parecen perfectamente felices con mi proxy.

izb
fuente

Respuestas:

336

Desde java 1.5 también puede pasar una instancia de java.net.Proxy al openConnection(proxy)método:

//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);

Si su proxy requiere autenticación, le dará la respuesta 407.

En este caso, necesitará el siguiente código:

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);
NickDK
fuente
77
¿Podemos proporcionar el nombre de usuario y la contraseña del proxy a través de él?
Xolve
15
¿Qué pasa si tiene diferentes pares de nombre de usuario / contraseña para los diferentes servidores proxy? Llamar a un método estático para establecer el Autenticador predeterminado no es ideal, esto no es mucho mejor que configurar el método de propiedades sys ..
javaPhobic
2
Authenticator.default es una variable estática (es decir, global), por lo que es solo una vez. Pero tenga en cuenta que el Autenticador anterior es solo un ejemplo mínimo. Solo puede manejar una contraseña a la vez. Google para ejemplos que pueden manejar múltiples hosts con diferentes contraseñas.
Stroboskop
3
Como 8u11, esto no funcionará de manera predeterminada con la autenticación básica, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html La propiedad del sistema jdk.http.auth.tunneling.disabledSchemes debe establecerse en emtpty
blanco
3
En caso de que tengas dominio. Haga lo siguiente:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Desarrollador Marius Žilėnas
34

Esto es bastante fácil de responder desde internet. Establecer propiedades del sistema http.proxyHosty http.proxyPort. Puede hacer esto con System.setProperty(), o desde la línea de comandos con la -Dsintaxis.

Sean Owen
fuente
19

Los proxies son compatibles con dos propiedades del sistema: http.proxyHost y http.proxyPort. Deben establecerse en el servidor proxy y el puerto respectivamente. El siguiente ejemplo básico lo ilustra:

String url = "http://www.google.com/",
       proxy = "proxy.mydomain.com",
       port = "8080";
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
readResponse(in);
Pascal Thivent
fuente
@Pascal ¿Sabes cuáles son las principales diferencias de usar el último enfoque de Java en comparación con Apache commons-httpclient? Como Java admite la representación y la autenticación (como mencionó aquí stackoverflow.com/questions/1626549/… ), para casos simples (como recuperar un archivo del servidor HTTP público) no hay razón para usar la biblioteca Apache. ¿Cuál es tu recomendación?
dma_k
@dma_k Estoy de acuerdo con usted, para casos de uso simples como el que describió, no usaría una biblioteca de terceros.
Pascal Thivent
¿Sabes cómo apoyar los noProxyHosts? Veo que mi dispositivo lo admite, pero no sabe cómo hacer que mi aplicación lo maneje.
RiRomain
Pero la variable systemPropertiesno es utilizada por connection!
analista
12

También puedes configurar

-Djava.net.useSystemProxies=true

En Windows y Linux, esto usará la configuración del sistema para que no tenga que repetirlo (SECO)

http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies

Daniel Worthington-Bodart
fuente
66
Esto funciona solo con la configuración manual del servidor proxy. La configuración automática del proxy y los proxies configurados a través del script no se propagan (todavía) a "useSystemProxies".
Neumáticos
1
Esto funcionó para mí al configurar proxyHost y proxyPort no. ¡Gracias!
nrobey
Del mismo modo, esto funcionó desde atrás del proxy de mi empresa cuando las llamadas System.setPropertypara el https.proxyHosty https.proxyPortpor alguna razón no estaban cortando la mostaza.
Pavel Komarov
10

Establezca siguiente antes de abrir Connect,

System.setProperty("http.proxyHost", "host");
System.setProperty("http.proxyPort", "port_number");

Si el proxy requiere autenticación,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
Codificador ZZ
fuente
77
De hecho, creo que "http.proxyUser" y "http.proxyPassword" ya no son compatibles. Consulte stackoverflow.com/questions/120797/… para obtener más detalles.
p3t0r
5

Para Java 1.8 y superior, debe configurar -Djdk.http.auth.tunneling.disabledSchemes=para hacer proxies con Autorización básica que funcione con https.

Anton
fuente
1
La información de fondo sobre esto se discute en stackoverflow.com/questions/41806422/…
U880D
2

La respuesta aprobada funcionará ... si conoce su host proxy y puerto =). Pero en caso de que esté buscando el host proxy y el puerto, los pasos a continuación deberían ayudar

si se proporciona proxy configurado automáticamente: entonces

1> abrir IE (o cualquier navegador)

2> obtenga la dirección URL de su navegador a través de IE-> Herramientas-> opción de Internet-> conexiones-> Configuración de LAN-> obtenga la dirección y proporcione la URL, por ejemplo: como http://autocache.abc.com/ e ingrese, a el archivo se descargará con formato .pac, guárdelo en el escritorio

3> abra el archivo .pac en el teclado de texto, identifique PROXY:

En su editor, vendrá algo como:

devuelve "PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";

felicitaciones a Bekur de Maven en 5 minutos no funciona

Una vez que tenga el host y el puerto, simplemente ingrese a esto y listo.

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Norbert
fuente