Java中HttpURLConnection使用代理服务器

Properties prop = System.getProperties();
// 设置http访问要使用的代理服务器的地址
prop.setProperty("http.proxyHost", "代理服务器地址");
// 设置http访问要使用的代理服务器的端口
prop.setProperty("http.proxyPort", "代理服务器的端口");
// 设置http访问要使用的代理服务器的用户名
prop.setProperty("http.proxyUser", "用户名");
// 设置http访问要使用的代理服务器的密码
prop.setProperty("http.proxyPassword", "密码");

用Java编写经过代理访问的应用程序 java

  本技巧将向您讲述如何编写可经过代理访问因特网上的Web服务器的Java应用程序。在Java应用程序中加入代理支持只需额外编写几行代码,且不依赖任何安全性“漏洞”。 编程

  几乎全部的公司都十分关注保护本身的内部网络,以防黑客及入窃者。一种常见的安全措施是彻底断开与因特网的链接。若是黑客们不能链接到您的任何一台机器,他们就不能非法进入您的系统。这种策略产生的不利反作用是,内部用户没法访问外部的因特网服务器,如Yahoo或JavaWorld。为了解决这一问题,网络管理员一般安装“代理服务器”。实际上,代理是安装于因特网和内部网之间的一种服务,用来管理这两个领域之间的链接。代理有助于减小安全性的外部威胁,同时还容许内部用户访问因特网服务。尽管Java使得编写因特网客户机再也不困难,可是若是客户机不能经过代理,则它们毫无用处。幸运的是,Java 使得使用代理支持再也不困难--若是您知道密诀,这就是事实。 浏览器

  将Java和代理结合起来的秘诀即在Java运行时激活特定的系统属性。这些属性未被写入正式文件,只是做为Java传说的一部分在Java编程人员中秘传。为了支持代理,Java应用程序不只须要指定代理自己的信息,并且须要指定用于认证的用户信息。在开始使用网际协议以前,您须要在程序中添加如下几行代码: 安全

System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost","myProxyMachineName");
System.getProperties().put("proxyPort","85");

  上面的第一行通知Java您要经过代理进行链接,第二行指定代理所在的机器,第三行指定代理监听的端口。有些代理在受权用户访问因特网以前,要求用户输入用户名和口令。若是您使用位于防火墙以内的Web浏览器,您就可能碰到过这种状况。如下是执行认证的方法: 服务器

URLConnection connection=url.openConnection();
String password="username:password";
String encodedPassword=base64Encode(password);
connection.setRequestProperty("Proxy-Authorization",encodedPassword);

  这段代码的思想是,您必须调整HTTP标头以发出用户信息。这是经过调用setRequestProperty()来实现的。这种方法容许您在发出请求以前处理HTTP标头。HTTP要求用base64对用户名和口令进行编码。幸运的是,有一组公用域API,它们将代您执行编码(请参阅参考资源部分)。 网络

  如您所见,在Java应用程序中加入代理支持并不须要作多少工做。有了如今的知识,再作一点研究(您必须查明您的代理是如何处理您感兴趣的协议以及如何进行用户认证的),您就能用其余协议实现代理。 函数

  FTP代理 测试

  ScottD.Taylor提出这个秘诀来处理FTP协议代理: 编码

defaultProperties.put("ftpProxySet","true");
defaultProperties.put("ftpProxyHost","proxy-host-name");
defaultProperties.put("ftpProxyPort","85");

  接下来您即可以经过如下代码使用"ftp"协议访问文件URL: url

URLurl = newURL("

  若是有人有使用其余网际协议代理的例子,我很想看看。

  注意:代码示例(Example.java)仅在JDK1.1.4下测试过。

  后续技巧!

  对于仍在使用JDK1.1.7(配合WebSphere3.0)的开发人员而言,将proxyHost和proxyPort设为系统属性不起做用;conn.getInputStream()或者返回链接超时,或者是找不到主机路径。可是,我使用接受Host和Port为参数的URL构造函数解决了这一问题(使用个人代理主机和端口):

public URL(Stringprotocol, Stringhost, intport, Stringfile).

  借助用户名和口令进行认证的方法不起做用。应将"Basic"置于认证字符串的开头;例如:

String encodedPassword = base64Encode(password);

  应该是:

String encodedPassword = "Basic"+base64Encode(password);

  您也没必要用一个单独的程序来进行64位编码。您可使用sun.misc.BASE64Encoder()类。下面是完成这两处改动以后的代码:

System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost",proxyHost);
System.getProperties().put("proxyPort",proxyPort);
String authString="userid:password";
String auth = "Basic" + newsun.misc.BASE64Encoder().encode(authString.getBytes());
URL url = newURL("
URLConnection conn = url.openConnection();
conn.setRequestProperty("Proxy-Authorization",auth);

  下面是使用socks4代理服务器的方法:

System.getProperty("socksProxySet",true);
System.getProperty("socksProxyHost",proxyHostName);
System.getProperty("socksProxyPort",proxyPort);

Usually the proxy Port for Socks4 is port 1080

  接下来您就能够用Socks4进行链接了。

相关文章
相关标签/搜索