也可以在通过命令行启动一个应用Java应用程序的JVM时,设置如下参数启动网络代理:
java -Dhttp.proxyHost=myproxyserver.com -Dhttp.proxyPort=80 MyJavaApp
或者在自己的Java代码中添加如下代码:
System.setProperty("http.proxyHost", "myProxyServer.com");System.setProperty("http.proxyPort", "80");
自Java1.5以后,也可以通过给openConnection()方法传递一个Java.net.Proxy类实例来启用网络代理:
//Proxy实例, 代理ip:123.0.0.1,端口号:8080Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("123.0.0.1", 8080));URL url = new URL("http://www.yahoo.com");HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy);uc.connect(); String page;StringBuffer tmp = new StringBuffer();BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));while ((line = in.readLine()) != null){ page.append(line + "\n");}System.out.println(page);
这样的话,就不需要设置系统属性(system properties)了。
你也可以使用默认的PROXY作为你的网络设置。
System.setProperty("java.net.useSystemProxies", "true");List l = null;try { l = ProxySelector.getDefault().select(new URI("http://www.yahoo.com"));}catch (URISyntaxException e) { e.printStackTrace();} if (l != null) { for (Iterator iter = l.iterator(); iter.hasNext() { java.net.Proxy proxy = (java.net.Proxy) iter.next(); System.out.println("proxy hostname : " + proxy.type()); InetSocketAddress addr = (InetSocketAddress) proxy.address(); if (addr == null) { System.out.println("No Proxy"); } else { System.out.println("proxy hostname : " + addr.getHostName()); System.out.println("proxy port : " + addr.getPort()); } }}
通过传递代理:
URL url = new URL("http://internal.server.local/");URLConnection conn = url.openConnection(Proxy.NO_PROXY);
代理与Username/Password
你可能需要定义你自己的代理服务器。
一种方案是使用HTTP代理“Proxy-Authorization”,传递一个username:password的base64编码字符串。
System.setProperty("http.proxyHost", "myProxyServer.com");System.setProperty("http.proxyPort", "80");URL url=new URL("http://someserver/somepage");URLConnection uc = url.openConnection ();String encoded = new String(Base64.base64Encode(new String("username:password").getBytes()));uc.setRequestProperty("Proxy-Authorization", "Basic " + encoded);uc.connect();
注意: 关于base64函数,查看这里:http://www.rgagnon.com/javadetails/java-0084.html。
下面的示例会对一个URL发起连接,但是在此之前,我们得定义我们的代理。
import java.net.*;import java.io.*; public class URLUtils { public static void main(String s[]) { URLUtils.dump("http://www.yahoo.com"); System.out.println("**************"); URLUtils.dump("https://www.paypal.com"); System.out.println("**************"); } public static void dump(String URLName){ try { DataInputStream di = null; FileOutputStream fo = null; byte [] b = new byte[1]; // PROXY System.setProperty("http.proxyHost","proxy.mydomain.local") ; System.setProperty("http.proxyPort", "80") ; URL u = new URL(URLName); HttpURLConnection con = (HttpURLConnection) u.openConnection(); // // 这不是一个使用sun.misc.* class的好主意 // Sun强烈建议,不要去使用它们 // 因为它有可能会在未来的版本中做出修改甚至删除 // 所以,请慎重 sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); String encodedUserPwd = encoder.encode("mydomain\\MYUSER:MYPASSWORD".getBytes()); con.setRequestProperty ("Proxy-Authorization", "Basic " + encodedUserPwd); // PROXY ---------- di = new DataInputStream(con.getInputStream()); while(-1 != di.read(b,0,1)) { System.out.print(new String(b)); } } catch (Exception e) { e.printStackTrace(); } }}
在JDK1.2中,java.net.Authenticator通常可以在需要时传递一个凭证。
public static void dump(String URLName){ try { DataInputStream di = null; FileOutputStream fo = null; byte [] b = new byte[1]; // PROXY System.setProperty("http.proxyHost","proxy.mydomain.local") ; System.setProperty("http.proxyPort", "80") ; Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("mydomain\\username","password".toCharArray()); }}); URL u = new URL(URLName); HttpURLConnection con = (HttpURLConnection) u.openConnection(); di = new DataInputStream(con.getInputStream()); while(-1 != di.read(b,0,1)) { System.out.print(new String(b)); } } catch (Exception e) { e.printStackTrace(); }}
通过传递代理 不畏不惧,不言不弃,冲破风雨的阻隔,黎明就在前方!