通过自建代理服务器增强 Applet 的功能(2)

发表于:2007-07-14来源:作者:点击数: 标签:
· 代理服务器 除了"数字签名技术"这种高级技术外,我们还可以使用其它的方法来加以实现。比如,你可以建一个网页,它可以内嵌你想要运行的小应用程序(这时它用的是存储你的服务器的假数据)。你可以提供一个按钮,用户可以使用这个按钮下载这个小应用程序

· 代理服务器

除了"数字签名技术"这种高级技术外,我们还可以使用其它的方法来加以实现。比如,你可以建一个网页,它可以内嵌你想要运行的小应用程序(这时它用的是存储你的服务器的假数据)。你可以提供一个按钮,用户可以使用这个按钮下载这个小应用程序和相应的策略文件,这样用户就可以从这个小应用程序运行的浏览器中运行它了。虽然这是一个可行的方法,但却使你的小应用程序的"魅力"大打折扣。好在还有另外一种方法。

代理服务器方法是另外一种突破安全性的限制,实现信息的提取,现在我们就详细的介绍一下。

在你的WEB服务器上安装一个代理服务器。它是一个服务程序,随着服务器的启动而自动运行,这个程序可以获取来自于网页的请求信息,并发送给请求它的任何人。举个例子来看一下:假设你的小应用程序向驻留在同一台主机上的代理服务器发关一个GET请求
http://www.server.com/proxysvr?URL=http://www.yahoo.com/search.pl?Name=ddvip

那么代理服务器会为这个小应用程序取回网页,并把它做为GET请求的答复发送回来,这样小应用程序就可以处理取回的信息了(参图三)

图三 通过代理服务器获取数据的流程
图三 通过代理服务器获取数据的流程

由此可见代理服务器可以实现这个功能,但现有的代理服务器都是功能丰富,而我们只是利用它的最基本的功能,所以建议大家用JAVA自己写一段代码。我们是用Servlet来实现的,一个Servlet是由一个Servlet引擎来启动的。现在大部分的网络服务器都可以运行Servlet。
代理服务器源代码(ProxySvr.java)

CCCCCC">import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ProxySvr extends HpptServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws SevletException, IOException {
String query = null;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
query = request.getParameter("URL");
if(query == null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST,
"Missing URL parameter");
return;
}
try {
query = URLDecoder.decode(query);
} catch(Exception exception) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST,
"URL decode error " + exception);
return;
}
try {
URL url = new URL(query);
BufferedReader in = new BufferedReader(new
InputStreamReader(url.openStream()));
String line;
while((line = in.readLine()) != null)
out.println(line);
out.flush();
} catch(IOException exception) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
"Exception: " + exception);
}
}
}

说明:WEB服务器的Servlet服务接收到一个GET请求时,它调用doGet()方法。HttpServletRequest参数包含请求参数。这个Servlet用getParameter()方法得到URL参数的值。在任何Servlet中,你需要把响应答复发送给HttpServletResponse类的getwriter()方法返回的PrintStream,这个Servlet连接URL参数指定的资源,每次读取它的数据,并把它发送给响应流。最后,用sendError()方法报告出现的错误。

· 小结

现在让我们回顾一下为什么代理服务器可以解决这个小应用程序的安全问题。当你的小应用程序要访问来自异地主机的信息时,它会将请求发送给驻留在本机上的代理服务器,然后代理服务器连接要访问的异地主机,取出所要求的数据,然后将数据返回给小应用程序。

虽然几经周折,但是却可以避免安全性的问题。OK,这也许并不是最好的解决方案,但是,它确实是一种实用的解决方案,欢迎大家一起研究。

· 参考资料

  • 下面是上述程序的源代码(ZIP格式)ProxySvr.zip
  • 《JAVA2核心技术》机械工业出版社
  • http://java.sun.com/docs/books/jls/index.html

· 关于作者

夏治(Tim),毕业于沈阳工业大学,学士学位,毕业后一直从事程序设计工作,对WEB程序设计有一定的见解,研究JAVA程序设计有近年的时间,通过了SUN公司的SCJP认证,对JAVA有一定程度的了解。现在在深圳一家IT企业工作,从事JAVA程序开发工作。足球是我一生的最爱,没有办法想像,没有足球的日子将会是什么样子。

原文转自:http://www.ltesting.net