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.

izb
fonte

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);
NickDK
fonte
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.

Sean Owen
fonte
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 Thivent
fonte
@ 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

Daniel Worthington-Bodart
fonte
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");
ZZ Coder
fonte
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.

Anton
fonte
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);
Norbert
fonte