《Java编程思想第4版[中文版](PDF格式)》第35章


本编制语言通常在自己可做的事情上有着很大的限制。Java 也设计成在一个安全“沙箱”里在它的程序片中 
运行,这样可防止操作位于沙箱以外的磁盘或者内存区域。
ActiveX 是所有这些里面最让人担心的。用 ActiveX 编写程序就象编制 Windows 应用程序——可以做自己想 
做的任何事情。下载回一个ActiveX 组件后,它完全可能对我们磁盘上的文件造成破坏。当然,对那些下载 
回来并不限于在Web 浏览器内部运行的程序,它们同样也可能破坏我们的系统。从 BBS 下载回来的病毒一直 
是个大问题,但因特网的速度使得这个问题变得更加复杂。
目前解决的办法是“数字签名”,代码会得到权威机构的验证,显示出它的作者是谁。这一机制的基础是认 
为病毒之所以会传播,是由于它的编制者匿名的缘故。所以假如去掉了匿名的因素,所有设计者都不得不为 
它们的行为负责。这似乎是一个很好的主意,因为它使程序显得更加正规。但我对它能消除恶意因素持怀疑 
态度,因为假如一个程序便含有Bug,那么同样会造成问题。
Java 通过“沙箱”来防止这些问题的发生。Java 解释器内嵌于我们本地的Web 浏览器中,在程序片装载时会 
检查所有有嫌疑的指令。特别地,程序片根本没有权力将文件写进磁盘,或者删除文件(这是病毒最喜欢做 
的事情之一)。我们通常认为程序片是安全的。而且由于安全对于营建一套可靠的客户机/服务器系统至关 
重要,所以会给病毒留下漏洞的所有错误都能很快得到修复(浏览器软件实际需要强行遵守这些安全规则; 
而有些浏览器则允许我们选择不同的安全级别,防止对系统不同程度的访问)。
大家或许会怀疑这种限制是否会妨碍我们将文件写到本地磁盘。比如,我们有时需要构建一个本地数据库, 
40 
…………………………………………………………Page 42……………………………………………………………
或将数据保存下来,以便日后离线使用。最早的版本似乎每个人都能在线做任何敏感的事情,但这很快就变 
得非常不现实(尽管低价“互联网工具”有一天可能会满足大多数用户的需要)。解决的方案是“签了名的 
程序片”,它用公共密钥加密算法验证程序片确实来自它所声称的地方。当然在通过验证后,签了名的一个 
程序片仍然可以开始清除你的磁盘。但从理论上说,既然现在能够找到创建人“算帐”,他们一般不会干这 
种蠢事。Java 1。1 为数字签名提供了一个框架,在必要时,可让一个程序片“走”到沙箱的外面来。
数字签名遗漏了一个重要的问题,那就是人们在因特网上移动的速度。如下载回一个错误百出的程序,而它 
很不幸地真的干了某些蠢事,需要多久的时间才能发觉这一点呢?这也许是几天,也可能几周之后。发现了 
之后,又如何追踪当初肇事的程序呢(以及它当时的责任有多大)?
6。 因特网和内联网
Web 是解决客户机/服务器问题的一种常用方案,所以最好能用相同的技术解决此类问题的一些“子集”, 
特别是公司内部的传统客户机/服务器问题。对于传统的客户机/服务器模式,我们面临的问题是拥有多种 
不同类型的客户计算机,而且很难安装新的客户软件。但通过 Web 浏览器和客户端编程,这两类问题都可得 
到很好的解决。若一个信息网络局限于一家特定的公司,那么在将Web 技术应用于它之后,即可称其为“内 
联网”(Intranet),以示与国际性的“因特网”(Internet )有别。内联网提供了比因特网更大的安全级 
别,因为可以物理性地控制对公司内部服务器的使用。说到培训,一般只要人们理解了浏览器的常规概念, 
就可以非常轻松地掌握网页和程序片之间的差异,所以学习新型系统的开销会大幅度减少。
安全问题将我们引入客户端编程领域一个似乎是自动形成的分支。若程序是在因特网上运行,由于无从知晓 
它会在什么平台上运行,所以编程时要特别留意,防范可能出现的编程错误。需作一些跨平台处理,以及适 
当的安全防范,比如采用某种脚本语言或者Java 。
但假如在内联网中运行,面临的一些制约因素就会发生变化。全部机器均为 Intel/Windows 平台是件很平常 
的事情。在内联网中,需要对自己代码的质量负责。而且一旦发现错误,就可以马上改正。除此以外,可能 
已经有了一些“历史遗留”的代码,并用较传统的客户机/服务器方式使用那些代码。但在进行升级时,每 
次都要物理性地安装一道客户程序。浪费在升级安装上的时间是转移到浏览器的一项重要原因。使用了浏览 
器后,升级就变得易如反掌,而且整个过程是透明和自动进行的。如果真的是牵涉到这样的一个内联网中, 
最明智的方法是采用ActiveX,而非试图采用一种新的语言来改写程序代码。
面临客户端编程问题令人困惑的一系列解决方案时,最好的方案是先做一次投资/回报分析。请总结出问题 
的全部制约因素,以及什么才是最快的方案。由于客户端程序设计仍然要编程,所以无论如何都该针对自己 
的特定情况采取最好的开发途径。这是准备面对程序开发中一些不可避免的问题时,我们可以作出的最佳姿 
态。
1。11。3 服务器端编程
我们的整个讨论都忽略了服务器端编程的问题。如果向服务器发出一个请求,会发生什么事情?大多数时候 
的请求都是很简单的一个“把这个文件发给我”。浏览器随后会按适当的形式解释这个文件:作为HTML 页、 
一幅图、一个Java 程序片、一个脚本程序等等。向服务器发出的较复杂的请求通常涉及到对一个数据库进行 
操作(事务处理)。其中最常见的就是发出一个数据库检索命令,得到结果后,服务器会把它格式化成HTML 
页,并作为结果传回来(当然,假如客户通过 Java 或者某种脚本语言具有了更高的智能,那么原始数据就能 
在客户端发送和格式化;这样做速度可以更快,也能减轻服务器的负担)。另外,有时需要在数据库中注册 
自己的名字(比如加入一个组时),或者向服务器发出一份订单,这就涉及到对那个数据库的修改。这类服 
务器请求必须通过服务器端的一些代码进行,我们称其为“服务器端的编程”。在传统意义上,服务器端编 
程是用 Perl 和 CGI 脚本进行的,但更复杂的系统已经出现。其中包括基于Java 的Web 服务器,它允许我们 
用Java 进行所有服务器端编程,写出的程序就叫作“小服务程序”(Servlet)。
1。11。4 一个独立的领域:应用程序
与Java 有关的大多数争论都是与程序片有关的。Java 实际是一种常规用途的程序设计语言,可解决任何类 
型的问题,至少理论上如此。而且正如前面指出的,可以用更有效的方式来解决大多数客户机/服务器问 
题。如果将视线从程序片身上转开(同时放宽一些限制,比如禁止写盘等),就进入了常规用途的应用程序 
的广阔领域。这种应用程序可独立运行,毋需浏览器,就象普通的执行程序那样。在这儿,Java 的特色并不 
仅仅反应在它的移植能力,也反映在编程本身上。就象贯穿全书都会讲到的那样,Java 提供了许多有用的特 
性,使我们能在较短的时间里创建出比用从前的程序设计语言更健壮的程序。
但要注意任何东西都不是十全十美的,我们为此也要付出一些代价。其中最明显的是执行速度放慢了(尽管 
41 
…………………………………………………………Page 43……………………………………………………………
可对此进行多方面的调整)。和任何语言一样,Java 本身也存在一些限制,使得它不十分适合解决某些特殊 
的编程问题。但不管怎样,Java 都是一种正在快速发展的语言。随着每个新版本的发布,它变得越来越可 
爱,能充分解决的问题也?
小说推荐
返回首页返回目录