网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.慎防恶意的JavaApplet.
.italics 方法.
.JXTA Platform JAVA参考实现源代.
.企业门户的发展方向.
.实战Java多线程编程精要之限制优.
.在BS系统中使用模态对话框(showM.
.用纯JAVA语言编程读取MAC地址的实.
.给大家推荐几个方便java编辑的软.
.选择Java接口还是抽象类.
.在Wicket里面使用一个自己WebSes.
.java线程简介(共享对数据的访问).
.BEATuxedo开发心得.
.配置WebLogic 8.1和Hibernate 3..
.关于SOA 的五种资产重用最佳实践.
.Java技术在嵌入式系统中的应用.
.JDK:java读文件的一点见解.
.Web Services带来了什么.
.玩转Java的CLASSPATH(三)JWhic.
.字节数最小的中国城市JavaScrip列.
.一个用JAVA开发的会话密钥程序,可.

用Java语言编写通过代理访问的应用程序

发表日期:2008-6-17


 

本技巧将向您讲述如何编写可通过代理访问因特网上的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构造函数解决了这一问题(使用我的代理主机和端口): /article.asp?typeid=160

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进行连接了。

上一篇:实例教程:Java Socket编程的一个秘密类 人气:1433
下一篇:为Tomcat注册的Windows服务增加安全参数 人气:1380
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐