本技巧将向您讲述如何编写可通过代理访问因特网上的 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 进行连接了。
///下面是一个例子!
import java.util.Properties;
import java.util.Date;
import java.net.URL;
import java.net.URLEncoder;
import java.net.HttpURLConnection;
import java.net.URLConnection;
import java.io.DataInputStream;
import java.io.DataOutputStream;
// This is a simple example that shows how to get HTTP connections to work
// with a proxy server. If all goes well, we should be able to post some
// data to a public cgi script and get back the resulting HTML. If anyone
// knows some "gotchas" when combining Java and proxies, I'd love to hear
// about them. Send your thoughts to kurr@ctron.com.
public class ProxyTest
{
public static void main( String argv[] )
{
try
{
// Enable the properties used for proxy support
System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "proxyHost", "proxy2" );
System.getProperties().put( "proxyPort", "85" );
// URL to a public cgi script
URL url = new URL("http://hoohoo.ncsa.uiuc.edu/cgi-bin/post-query/");
URLConnection connection = url.openConnection();
// enter the username and password for the proxy
String password = "username:password";
// base64 encode the password. You can write your own,
// use a public domain library like
// http://www.innovation.ch/java/HTTPClient/ or use
// the sunw.server.admin.toolkit.security.BASE64Encoder
// class from JavaSoft Java Web Server.
String encoded = base64Encode( password );
// Set up the connection so it knows you are sending
// proxy user information
connection.setRequestProperty( "Proxy-Authorization", encoded );
// Set up the connection so you can do read and writes
connection.setDoInput( true );
connection.setDoOutput( true );
// open up the output stream of the connection
DataOutputStream output = new DataOutputStream(
connection.getOutputStream() );
// simulate a POST from a web form
String query = "name=" + URLEncoder.encode(
"Ronald D. Kurr" );
query += "&";
query += "email=" + URLEncoder.encode( "kurr@ctron.com" );
// write out the data
int queryLength = query.length();
output.writeBytes( query );
output.close();
// get ready to read the response from the cgi script
DataInputStream input = new DataInputStream(
connection.getInputStream() );
// read in each character until end-of-stream is detected
for( int c = input.read(); c != -1; c = input.read() )
{
System.out.print( (char)c );
}
input.close();
}
catch( Exception e )
{
System.out.println( "Something bad just happened." );
System.out.println( e );
e.printStackTrace();
}
}
}
分享到:
相关推荐
JAVA 通过proxy代理方式访问internet资源,
在Java编程环境中,当需要通过局域网(LAN)进行网络通信时,有时会遇到需要使用代理服务器的情况。代理服务器可以提供多种功能,包括提高访问速度、缓存、过滤网络内容以及匿名上网等。本文将深入探讨如何在Java中...
Java 实现的代理服务器是一种基于Java编程语言的网络服务,它的主要作用是充当客户端与目标服务器之间的中介。这种代理服务器可以用于多种用途,包括数据抓取、匿名浏览、网络安全管理和性能优化等。在这个实例中,...
这样的设计使得用户可以通过代理服务器访问互联网,从而实现多种功能,如匿名浏览、负载均衡、缓存优化、网络监控等。在这个Java实现的代理服务器程序中,我们可以深入探讨几个关键的技术点。 首先,代理服务器的...
"Java的HTTP代理服务器 Smart Cache" 是一个基于Java开发的网络工具,主要用于处理HTTP网络请求,同时具备缓存功能,可以提升数据访问速度并减轻服务器压力。它利用了Java的多线程和网络编程能力,实现了对HTTP协议...
Java代理服务器是一种网络通信工具,它允许客户端通过它与目标服务器进行通信,以此来隐藏原始客户端的IP地址或者实现特定的网络访问策略。在Java中实现代理服务器涉及到多个关键概念和技术,包括网络编程、多线程...
Java代理服务器是一种网络通信工具,它允许客户端(如浏览器)通过代理来访问其他网络资源,提供了额外的安全性、隐私保护以及可能的性能优化。在Java中实现代理服务器,主要是通过Socket编程来完成的。下面我们将...
总的来说,这个Java代理服务器示例提供了一个基础的代理服务实现,有助于理解网络编程、HTTP协议以及Java中的多线程和网络通信机制。通过扩展这个基础代码,可以实现更复杂的代理功能,如缓存、访问控制、加密等。
Java开发代理服务器是使用Java语言开发的一个代理服务器程序,支持常见的HTTP代理和Sock4、Sock5代理,可以用于局域网中,通过代理服务器连接Internet,以实现常用的Internet操作。 代理服务器的主要功能是代理网络...
当客户端通过代理服务器访问目标服务器时,所有网络流量都会经过代理,这使得代理能够记录、分析或修改数据流。代理服务器在网络安全、性能优化、内容过滤等方面有广泛应用。 3. **代理的工作原理**: - 客户端...
综上所述,Java开发的邮件代理服务器是一个集成了多种Java技术的复杂系统,它涉及网络编程、数据库操作、邮件协议处理、安全加密、并发控制等多个领域,体现了Java作为企业级开发语言的强大能力。开发者在构建这样的...
代理服务器的主要功能包括缓存、数据过滤、访问控制、负载均衡等,从而提高网络性能,保护内部网络,或者提供额外的安全性。在这个主题中,我们将深入探讨如何在Java中实现一个基本的代理服务器。 首先,`...
代理服务器是一种网络服务,允许一个客户端通过这个服务与另一个网络服务进行非直接的连接。...代理服务器的应用广泛,可以用于网络加速、内容过滤、访问控制等多个场景中,是一个网络架构中的重要组成部分。
Java HTTP / HTTPS代理服务器代理服务器代理服务器是位于客户端和客户端希望从中检索文件的远程服务器之间的服务器。 来自客户端的所有流量都被发送到代理服务器,并且代理服务器代表客户端向远程服务器发出请求。 ...
在Java编程中,有时我们需要通过Internet Explorer(IE)的代理设置来访问网络资源,这主要适用于需要模拟用户网络环境或避开某些网络限制的情况。本文将详细介绍如何在Java中使用IE Proxy代理来实现这一功能。 ...
文中提到的身份认证机制,遵循HTTP协议中关于用户身份验证的规范,旨在确保只有授权用户能够通过代理服务器访问网络资源。 缓存技术是代理服务器提高性能的关键。代理服务器可以存储频繁访问的网页或对象,当客户端...
代理服务器打开一个端口接收浏览器发来的访问某个站点的请求,从请求的字符串中解析出用户想访问哪个网页,让后通过URL对象建立输入流读取相应的网页内容,最后按照web服务器的工作方式将网页内容发送给用户浏览器 ...
RabbIT是一个用Java语言实现的Web代理服务器,它允许用户通过配置来控制网络流量,提高网络访问效率,同时为开发和测试提供了便利。 【Java技术】 Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处...
总的来说,《基于Java多线程的HTTP代理服务器的研究与实现》这篇文档会详细阐述如何利用Java的多线程、网络编程和并发特性来构建一个功能完善的HTTP代理服务器,包括设计思路、核心技术、实现细节和最佳实践。...
本教程将详细讲解如何使用Java编程语言来创建一个代理服务器,以实现对网络请求的转发处理。 首先,我们需要理解代理服务器的基本原理。代理服务器是一个位于客户端和目标服务器之间的中间服务器,它接收客户端的...