使用 Java 连接处于proxy(or 防火墙)之外的HTTP服务器

防火墙|服务器

我到sun站点上,发现他们的java Applet聊天室能够突破proxy,
我在公司的局域网可以使用的,而一般的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 代理
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 下测试过。

后续技巧!  
来自 Marla Bonar:

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

public URL(String protocol, String host, int port, String file).

来自 Dylan Walsh:

借助用户名和口令进行认证的方法不起作用。应将 "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 进行连接了。

时间: 2024-09-29 13:58:36

使用 Java 连接处于proxy(or 防火墙)之外的HTTP服务器的相关文章

Java使用代理Proxy访问网络及其验证

在Java的网络编程中,有时候内网服务器需要访问外网的网络资源,这时候就需要使用代理. 设置代理(Proxy)可以有两种方式: 1.通过设置系统属性(System.setPropery(String key, String value)的方式 可以使用其中的http.proxyHost,http.proxyPort这两个属性,分别设置代理服务器地址和代理端口. 1 2 3 //在你发起Http请求之前设置一下属性 System.setProperty("http.proxyHost",

基于Java Socket的自定义协议,实现Android与服务器的长连接(一)

一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解更加顺畅. 1. 网络七层协议 OSI的7层从上到下分别是:7 应用层. 6 表示层. 5 会话层. 4 传输层. 3 网络层. 2 数据链路层. 1 物理层;其中高层(即7.6.5.4层)定义了应用程序的功能,下面3层(即3.2.1层)主要面向通过网络的端到端的数据流.应用层常见的协议有:HTTP

Java连接Vmware中的redis

这篇文章主要为大家介绍了Java连接Vmware中的redis 本文使用的vmware 11,安装的系统是centos6.7,redis版本是3..0.2 .如何安装请参考上一篇文章<Linux下安装Redis并设置相关服务>.          安装完redis以后,我们是不是要迫不及待的想使用一下呢.那么我们要在程序中对redis进行操作的话,操作redis的插件有好几种,这里使用的jedis.          我们新建一个java程序以后,添加上Jedis.jar以后,并添加junit

java连接mysql中遇到的问题

问题描述 本人之前的mysql卸载重新装了一个5.0版本的,在数据库中已经写入了东西,可以在mysql读出,但是使用java连接的时候总是说连接不上.自己的用户名.密码.url都没有问题,请大家指导一下.Exceptioninthread"main"com.mysql.jdbc.CommunicationsException:Communicationslinkfailureduetounderlyingexception:**BEGINNESTEDEXCEPTION**java.ne

java连接mysql,mysql需要代理访问外网

问题描述 java连接mysql,mysql需要代理访问外网 现在mysql数据库所在的服务器需要通过https代理连接互联网,我在互联网上的java端如何连接到该mysql数据库呢!求大神告知 解决方案 如果你的是服务端程序,可以直接将程序和mysql放在同一服务器上 解决方案二: 参考MySQL Connect via proxy in JavaJDBC Connection via HTTPS ProxyConnect to MySQL using JDBC driver through

Java连接SQL Server 2000

server   数据库操作现在是项目开发的根本,学习Java首先应该学会怎么样连接数据库,用Java连接数据库可不像用Delphi这类工具那样设几个属性就OK,说简单也简单,说复杂,其实也挺复杂的,而且很麻烦,如果是初学,根本不能保证第一次就连接成功,下面以SQL Server 2000为例,说说Java连接数据库的基本方法,也记录一下心得. 1.下载SQL Server 2000 driver for JDBC       SQL Server 2000 Driver For JDBC Do

Java连接Sybase数据库

数据|数据库   Java连接Sybase数据库第一步:工欲善其事,必先利其器.(下载驱动)下载JDBC驱动:网址:http://www.sybase.com/detail?id=1009726有jConnect6.0和jConnect5.5两种,我们下载6.0版本. 第二步:得到驱动释放下载的jConnect-6_0.zip文件,其中有文件夹:devclasses,其下有一jar文件jconn3d.我们将jconn3d.jar也释放,其实可以不释放,为了说明简便,我们将它释放到任意文件夹,比如

使用java连接AD域,验证账号密码是否正确

web项目中有时候客户要求我们使用ad域进行身份确认,不再另外做一套用户管理系统.其实客户就是只要一套账号可以访问所有的OA,CRM等办公系统. 这就是第三方验证.一般有AD域,Ldap,Radius,邮件服务器等.最常用的要数AD域了.因为window系统在国内占据了大量的江山.做起来也很方便. 我这篇文章就是写,如何用java去实现AD域的身份验证.好了,直接看代码吧: package com.test; import java.util.Hashtable; import javax.na

远程访问-java 连接其它电脑access 实例

问题描述 java 连接其它电脑access 实例 1:首先我通过配置ODBC数据源进行连接: String url="jdbc:odbc:lyjtest"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection(url,"",""); stmt = conn.createStatement(); 第一次是可以连接,但