Acesso a URL através de Proxy

Em um projeto necessitei disponibilizar um portlet de Twitter para que os funcionários pudessem consultar as novidades da empresa. O problema é que o Twitter é bloqueado em toda a empresa. A solução foi utilizar um proxy que liberava o acesso somente no servidor. Para não alterar o servidor e utilizar somente na aplicação temos algumas opções: passando parâmetros para a aplicação ou realizando de forma programática.

A solução mais simples é passar como propriedade de sistema para a aplicação com os seguinte parâmetros:

  • http.proxyHost: Endereço do proxy
  • http.proxyPort: Porta do proxy, se não especificada o valor padrão é 80
  • http.nonProxyHosts: Endereços que não serão passados pelo proxy. Podem ser usados curingas

A documentação desses parâmetros, inclusive para ftp, pode ser encontrada em: http://download.oracle.com/javase/6/docs/technotes/guides/net/properties.html

Para passar os parâmetros na sua aplicação é só usar o -D. Como por exemplo: java -Dhttp.proxyHost=192.168.1.100 -Dhttp.proxyPort=3214 br.com.thiagovespa.sample.proxy.MinhaApp

Outra maneira é setar esses parâmetros via código:

System.setProperty("http.proxyHost", "192.168.1.100");
System.setProperty("http.proxyPort";, "3214");

Uma vez setado, vale para toda a aplicação. Como a alteração no código que eu precisava era específico para Twitter e queria controlar isso programaticamente, procurei um pouco e encontrei um recurso novo na API do Java 5: a classe Proxy. Ao buscar no Google você encontrará vários sites explicando como fazer o mesmo com o commons httpclient da Apache, mas a solução disponibilizada no Java 5 é suficiente e elegante.

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("192.168.1.100", 3214));
URL url = new URL("http://www.thiagovespa.com.br");
HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy);
uc.connect();
// ...

Simples e funcional! 🙂

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6