background image

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 浏览器,您就可能碰到过这种情况。以下是执行认
证的方法:
  URLConnectionconnection=url.openConnection();
  Stringpassword="username:password";
  StringencodedPassword=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");