几乎所有的公司都十分关注保护自己的内部网络以防黑客及入窃者一种常见的安全措施是完全断开与因特网的连接如果黑客们不能连接到您的任何一台机器他们就不能非法进入您的系统这种策略产生的不利副作用是内部用户无法访问外部的因特网服务器如 Yahoo 或 JavaWorld为了解决这一问题网络管理员通常安装代理服务器实际上代理是安装于因特网和内部网之间的一种服务用来管理这两个领域之间的连接代理有助于减少安全性的外部威胁同时还允许内部用户访问因特网服务尽管 Java 使得编写因特网客户机不再困难但是如果客户机不能通过代理则它们毫无用处幸运的是Java 使得使用代理支持不再困难 如果您知道密诀这就是事实
将 Java 和代理结合起来的秘诀即在 Java 运行时激活特定的系统属性这些属性未被写入正式文件只是作为 Java 传说的一部分在 Java 编程人员中秘传为了支持代理Java 应用程序不仅需要指定代理本身的信息而且需要指定用于认证的用户信息在开始使用网际协议之前您需要在程序中添加以下几行代码
SystemgetProperties()put( proxySet true );
SystemgetProperties()put( proxyHost myProxyMachineName );
SystemgetProperties()put( proxyPort );
上面的第一行通知 Java 您要通过代理进行连接第二行指定代理所在的机器第三行指定代理监听的端口有些代理在授权用户访问因特网之前要求用户输入用户名和口令如果您使用位于防火墙之内的 Web 浏览器您就可能碰到过这种情况以下是执行认证的方法
URLConnection connection = urlopenConnection();
String password = username:password;
String encodedPassword = baseEncode( password );
connectionsetRequestProperty( ProxyAuthorization encodedPassword );
这段代码的思想是您必须调整 HTTP 标头以发出用户信息这是通过调用 setRequestProperty() 来实现的这种方法允许您在发出请求之前处理 HTTP 标头HTTP 要求用 base 对用户名和口令进行编码幸运的是有一组公用域 API它们将代您执行编码(请参阅参考资源部分)
如您所见在 Java 应用程序中加入代理支持并不需要做多少工作有了现在的知识再做一点研究(您必须查明您的代理是如何处理您感兴趣的协议以及如何进行用户认证的)您就能用其他协议实现代理
FTP 代理
Scott D Taylor 提出这个秘诀来处理 FTP 协议代理
defaultPropertiesput( ftpProxySet true );
defaultPropertiesput( ftpProxyHost proxyhostname );
defaultPropertiesput( ftpProxyPort );
接下来您便可以通过以下代码使用 ftp 协议访问文件 URL
URL url = new URL(ftp:///pub/navigator//windows/readmetxt );
如果有人有使用其他网际协议代理的例子我很想看看
注意 代码示例 (Examplejava) 仅在 JDK 下测试过
后续技巧!
对于仍在使用 JDK (配合 WebSphere )的开发人员而言将 proxyHost 和 proxyPort 设为系统属性不起作用conngetInputStream() 或者返回连接超时或者是找不到主机路径但是我使用接受 Host 和 Port 为参数的 URL 构造函数解决了这一问题(使用我的代理主机和端口)
public URL(String protocol String host int port String file)
借助用户名和口令进行认证的方法不起作用应将 Basic 置于认证字符串的开头例如
String encodedPassword = baseEncode( password );
应该是
String encodedPassword = Basic + baseEncode( password );
您也不必用一个单独的程序来进行 位编码您可以使用 sunmiscBASEEncoder() 类下面是完成这两处改动之后的代码
SystemgetProperties()put(proxySet true);
SystemgetProperties()put(proxyHost proxyHost);
SystemgetProperties()put(proxyPort proxyPort);
String authString = userid:password;
String auth = Basic + new sunmiscBASEEncoder
()encode(authStringgetBytes());
URL url = new URL();
URLConnection conn = urlopenConnection();
connsetRequestProperty(ProxyAuthorization auth);
下面是使用 socks 代理服务器的方法
SystemgetProperty(socksProxySet true);
SystemgetProperty(socksProxyHost proxyHostName);
SystemgetProperty(socksProxyPort proxyPort);
Usually the proxyPort for Socks is port
接下来您就可以用 Socks 进行连接了