Como faço para o HttpURLConnection usar um proxy?


136

Se eu fizer isso ...

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

imprime

Proxy? false

O problema é que estou atrás de um proxy. De onde a JVM obtém suas informações de proxy no Windows? Como faço para configurar isso? Todos os meus outros aplicativos parecem perfeitamente felizes com meu proxy.

Respostas:


336

Desde o java 1.5, você também pode passar uma instância do java.net.Proxy para o 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);

Se o seu proxy exigir autenticação, ele fornecerá a resposta 407.

Nesse caso, você precisará do seguinte código:

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);

7
podemos fornecer nome de usuário e senha de proxy por meio dele.
— Xolve

15
E se você tiver diferentes pares de nome de usuário / senha para os diferentes proxies? Chamando um método estático para definir o padrão autenticador não é o ideal, isso não é muito melhor do que definir o método de sys propriedades ..
— javaPhobic

2
Authenticator.default é uma variável estática (ou seja, global), portanto é apenas uma vez. Mas observe que o autenticador acima é apenas um exemplo mínimo. Ele pode manipular apenas uma senha por vez. Google para exemplos que podem lidar com vários hosts com senhas diferentes.
— Stroboskop

3
Como 8u11, isso não funcionará por padrão com a autenticação Básica, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes a propriedade do sistema deve ser definida como emtpty
— branco

3
Caso você tenha domínio. Faça o seguinte:new PasswordAuthentication("domainName\\user", "password".toCharArray());
— Developer Marius Žilėnas

34

É fácil responder da internet. Defina as propriedades do sistema http.proxyHoste http.proxyPort. Você pode fazer isso com System.setProperty()ou na linha de comando com a -Dsintaxe.


19

Os proxies são suportados por duas propriedades do sistema: http.proxyHost e http.proxyPort. Eles devem ser configurados para o servidor proxy e a porta, respectivamente. O exemplo básico a seguir ilustra isso:

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 Você sabe quais são as principais diferenças do uso da última abordagem Java em comparação ao Apache commons-httpclient? Como o Java suporta proxy e autenticação (como você mencionou aqui stackoverflow.com/questions/1626549/… ), em casos simples (como recuperar um arquivo do servidor HTTP público), não há razão para usar a biblioteca Apache. Qual é a sua recomendação?
— precisa saber é

@dma_k Concordo com você, para casos de uso simples como o que você descreveu, eu não usaria uma biblioteca de terceiros.
— Pascal Thivent

Você sabe como apoiar os nonProxyHosts? Vejo que meu dispositivo suporta, mas não sabe como fazer meu aplicativo lidar com isso.
— RiRomain

Mas a variável systemPropertiesnão é usada pelo connection!
— parsecer 30/03/19

12

Você também pode definir

-Djava.net.useSystemProxies=true

No Windows e Linux, isso usará as configurações do sistema para que você não precise se repetir (DRY)

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


6
Isso funciona apenas com a configuração manual do servidor proxy. A configuração automática de proxy e os proxies configurados por meio de script ainda não são propagados para "useSystemProxies".
— Pneus

1
Isso funcionou para mim ao definir o proxyHost e o proxyPort não. Obrigado!
— N

Da mesma forma, isso funcionou por trás do proxy da minha empresa quando as chamadas System.setPropertypara https.proxyHoste https.proxyPortpor algum motivo não estavam cortando a mostarda.
— Pavel Komarov

10

Defina o seguinte antes de abrirConnection,

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

Se o proxy exigir autenticação,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");

7
Na verdade, acho que "http.proxyUser" e "http.proxyPassword" não são mais suportados. Consulte stackoverflow.com/questions/120797/… para obter mais detalhes.
— P3t0r 29/10/2009

5

Para Java 1.8 e superior, você deve configurar -Djdk.http.auth.tunneling.disabledSchemes=para criar proxies com a Autorização Básica trabalhando com https.


1
Informações
— básicas

2

A resposta aprovada funcionará ... se você conhece seu host proxy e porta =). Mas caso você esteja procurando pelo host e porta proxy, as etapas abaixo devem ajudar

se o proxy configurado automaticamente for fornecido:

1> abrir o IE (ou qualquer navegador)

2> obtenha o endereço de URL do navegador através do IE-> Ferramentas-> opção de Internet-> conexões-> Configurações da LAN-> obtenha o endereço e especifique o URL, por exemplo: como http://autocache.abc.com/ e insira, um o arquivo será baixado no formato .pac, salve na área de trabalho

3> abra o arquivo .pac no bloco de texto, identifique o PROXY:

No seu editor, virá algo como:

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

parabéns a bekur de maven em 5 min não funciona

Depois de ter o host e a porta, basta entrar nessa e você estará pronto

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.