如何编写可通过代理访问因特网上的Web服务器的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浏览器,您就可能碰到过这种情况。以下是执行认证的方法:

URLConnectionconnection=url.openConnection();
Stringpassword="username:password";
StringencodedPassword=base64Encode(password);
connection.setRequestProperty("Proxy-Authorization",encodedPassword);

这段代码的思想是,您必须调整HTTP标头以发出用户信息。这是通过调用setRequestProperty()来实现的。这种方法允许您在发出请求之前处理HTTP标头。HTTP要求用base64对用户名和口令进行编码。幸运的是,有一组公用域API,它们将代您执行编码(请参阅参考资源部分)。

如您所见,在Java应用程序中加入代理支持并不需要做多少工作。有了现在的知识,再做一点研究(您必须查明您的代理是如何处理您感兴趣的协议以及如何进行用户认证的),您就能用其他协议实现代理。

FTP代理

ScottD.Taylor提出这个秘诀来处理FTP协议代理:

defaultProperties.put("ftpProxySet","true");
defaultProperties.put("ftpProxyHost","proxy-host-name");
defaultProperties.put("ftpProxyPort","85");

接下来您便可以通过以下代码使用"ftp"协议访问文件URL:

URLurl=newURL("ftp://ftp.netscape.com/pub/navigator/3.04/windows/readme.txt");

如果有人有使用其他网际协议代理的例子,我很想看看。

注意:代码示例(Example.java)仅在JDK1.1.4下测试过。

后续技巧!

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

publicURL(Stringprotocol,Stringhost,intport,Stringfile).

借助用户名和口令进行认证的方法不起作用。应将"Basic"置于认证字符串的开头;例如:

StringencodedPassword=base64Encode(password);

应该是:

StringencodedPassword="Basic"+base64Encode(password);

您也不必用一个单独的程序来进行64位编码。您可以使用sun.misc.BASE64Encoder()类。下面是完成这两处改动之后的代码:

System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost",proxyHost);
System.getProperties().put("proxyPort",proxyPort);
StringauthString="userid:password";
Stringauth="Basic"+newsun.misc.BASE64Encoder
().encode(authString.getBytes());
URLurl=newURL("http://java.sun.com/");
URLConnectionconn=url.openConnection();
conn.setRequestProperty("Proxy-Authorization",auth);

下面是使用socks4代理服务器的方法:

System.getProperty("socksProxySet",true);
System.getProperty("socksProxyHost",proxyHostName);
System.getProperty("socksProxyPort",proxyPort);
UsuallytheproxyPortforSocks4isport1080

接下来您就可以用Socks4进行连接了。

时间: 2024-08-01 22:24:42

如何编写可通过代理访问因特网上的Web服务器的Java应用程序的相关文章

web java-局域网内,我同学不能访问我电脑上的web服务器

问题描述 局域网内,我同学不能访问我电脑上的web服务器 如题,局域网内,我同学不能访问我电脑上的web服务器,请帮我解答一下,谢谢谢谢 解决方案 先用本机访问,看看行不行,不行是你的配置问题,如果行,那么检查下你的防火墙的80端口有没有打开.两计算机有没有连好.

wifi-win8创建WiFi,手机能联网,但不能访问本机局域网web服务器

问题描述 win8创建WiFi,手机能联网,但不能访问本机局域网web服务器 一开始自己用netsh wlan命令创建WiFi,但手机一直显示"正在获取ip".试过多款软件,WiFi共享精灵,猎豹,360免费WiFi,情况都是手机能联网,但是不能访问本机部署的局域网服务器.因为在开发移动web项目,需要在手机上调试页面效果. 同事也是用360WiFi,我手机能访问他电脑上的服务器. 不知道还需要在电脑上设置哪里?

在Ubuntu Linux上架设Web服务器详解

Apache 是一种功能强大的Web服务器.如今,Internet上无数运行在Linux上的Apache服务器正为Web世界的日益繁荣提供着有力的支撑.本文将向读者介绍如何在Ubuntu Linux系统迅速搭建Apache Web服务器. 尽管Ubuntu 是一种新兴的Linux分支,但Ubuntu 组织却为Apache提供了丰富的支持软件,这些软件都可以从发行版的光盘获取,也可以从官方站点轻松下载.所以,Ubuntu非常适合作为Web服务器的平台. 一. 安装Apache 下面,我们首先介绍如

在 RHEL/CentOS 上为Web服务器架设 “XR”(Crossroads) 负载均衡器

Crossroads 是一个独立的服务,它是一个用于Linux和TCP服务的开源负载均衡和故障转移实用程序.它可用于HTTP,HTTPS,SSH,SMTP 和 DNS 等,它也是一个多线程的工具,在提供负载均衡服务时,它可以只使用一块内存空间以此来提高性能. 首先来看看 XR 是如何工作的.我们可以将 XR 放到网络客户端和服务器之间,它可以将客户端的请求分配到服务器上以平衡负载. 如果一台服务器宕机,XR 会转发客户端请求到另一个服务器,所以客户感觉不到停顿.看看下面的图来了解什么样的情况下,

在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务

   我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务.那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务呢?在这一篇文章中,我们将在Android系统的应用层增加一个内置的应用程序,这个内置的应用程序通过ServiceManager接口获取指定的服务,然后通过这个服务来获得硬件服务.         一. 参照在Ubuntu上为Android系统的Application Frameworks层增

不能访问Web服务器的解决方法

访问Web服务器是许多局域网用户经常要做的一项"功课",在频繁访问过程中,不少朋友积累了一些Web服务器访问经验,这些经验常常会帮助他们快速解决一些无法访问的小故障. 访问Web服务器是许多局域网用户经常要做的一项"功课",在频繁访问过程中,不少朋友积累了一些Web服务器访问经验,这些经验常常会帮助他们快速解决一些无法访问的小故障.不过,本文下面贡献出来的Web服务器不能访问故障现象却比较特别,如果不加细细分析,单纯以经验来解决故障时,多半容易走弯路:为了帮助各位朋

用JAVA编写Web服务器

//WebServer.java 用JAVA编写Web服务器 import java.io.*; import java.net.*; public class WebServer { public static void main(String args[]) { int i=1, PORT=8080; ServerSocket server=null; Socket client=null; try { server=new ServerSocket(PORT); System.out.pr

有谁用VB6做过HTTP上传文件吗,用Microsoft.XMLHTTP或者其它组件,上传到.NET或者JAVA的WEB服务器

问题描述 问题的提出:客户打开网页,已经知道客户本地硬盘上的文件路径和目录,在客户不打开文件选择窗口的情况下,把客户的文件上传到J2EE的WEB服务器,采用JAVA的COS组件来存取文件.初步的解决办法:用VB6做一个OCX控件,放在网页里面,把文件地址和WEB服务器上传路径传给这个控件,然后调用这个控件的上传方法,上传文件,找了很多资料后,只是做到了可以上传文本文件,二进制文件没有搞定.然后做了一个网页,提交一个FORM(method="post"enctype="mult

Outlook 2010中邮件授权代理访问的问题

同事要实现这个功能:当老板收到Meeting Request时,秘书也会收到一份,并允许秘书替老板接受或者拒绝这个会议. 解决方案:启用代理访问来实现 步骤:Outlook 2010 --> File -->Info--> Account Settings-->Delegate Access,赋予需要的权限即可 这个功能在Exchange上授权,需要manager才有权限做这个动作. 微软解决方案:http://office.microsoft.com/zh-cn/help/all