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