如何使用 Java 连接处于公司防火墙之外的 HTTP 服务器
2008-01-05 10:24:21 来源:WEB开发网核心提示:将 java 和代理结合起来的秘诀即在 Java 运行时激活特定的系统属性,这些属性未被写入正式文件,如何使用 Java 连接处于公司防火墙之外的 HTTP 服务器,只是作为 Java 传说的一部分在 Java 编程人员中秘传,为了支持代理,使用的是 C++、Unix 和 NT,近两年,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 代理
Scott D. Taylor 提出这个秘诀来处理 FTP 协议代理:
defaultProperties.put( "ftpProxySet", "true" );
defaultProperties.put( "ftpProxyHost", "proxy-host-name" );
defaultProperties.put( "ftpProxyPort", "85" );
接下来您便可以通过以下代码使用 "ftp" 协议访问文件 URL:
URL url = new URL("ftp://ftp.netscape.com/pub/navigator/3.04/windows/readme.txt" );
假如有人有使用其他网际协议代理的例子,我很想看看。
注重:代码示例 (Example.java) 仅在 JDK 1.1.4 下测试过。
对于仍在使用 JDK 1.1.7(配合 WebSphere 3.0)的开发人员而言,将 proxyHost 和 proxyPort 设为系统属性不起作用;conn.getInputStream() 或者返回连接超时,或者是找不到主机路径。但是,我使用接受 Host 和 Port 为参数的 URL 构造函数解决了这一问题(使用我的代理主机和端口):
public URL(String protocol, String host, int port, String file).
借助用户名和口令进行认证的方法不起作用。应将 "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 " + new sun.misc.BASE64Encoder
().encode(authString.getBytes());
URL url = new URL("http://java.sun.com/");
URLConnection conn = url.openConnection();
conn.setRequestProperty("Proxy-Authorization", auth);
来自 Marcel Oerlemans:
下面是使用 socks 4 代理服务器的方法:
System.getProperty("socksProxySet", true);
System.getProperty("socksProxyHost", proxyHostName);
System.getProperty("socksProxyPort", proxyPort);
Usually the proxyPort for Socks 4 is port 1080
接下来您就可以用 Socks 4 进行连接了。
作者简介
在过去的八年中,Ron Kurr 一直在 Cabletron Systems 公司担任软件工程师,使用的是 C++、Unix 和 NT。近两年,他一直在潜心研究 Java 和因特网技术。
更多精彩
赞助商链接