Tomcat 7的七大特性:新特性与增强功能
作者: Avneet Mangat译者:Sheneyan(子乌)时间:2010-09-28英文原文:Top 7 Features in Tomcat 7: The New and the Improved
Tomcat 7 在加强原有功能的同时也增加了一些新特性。有些文章列举了Tomcat 7的新特性,但大多数都没有对它们进行详细地解释、评价并给出可执行的示例。除了列举出新特性,这篇文章还对Tomcat 7的七个最值得注意的特性与增强部分进行分类、评定以及演示可执行代码以使你能够对每个特性/加强有个更好的理解。
我将下面列举的这些分类为“Tomcat 7 新特色:创新性改变”和“Tomcat 7 加强:进化性改变”:
Tomcat 7 新特性:创新性改变
Tomcat 7 加强:进化性改变
据 Mark Thomas(Tomcat 7的发布负责人及提交者)所言,Tomcat 7最引人注目的三个特点 是 Servlet 3.0, 内存泄露预防与检测,和提高的安全性。
随附的 Tomcat 7 演示 文件包含了一个Eclipse攻城和一个Ant创建文件,你可以用其创建一个war包。Eclipse工程中的示例代码描述了Tomcat 7的两个新特性。
这篇文章的其余部分将详细阐述这七个最值得的关注新特性和增强功能。&
Tomcat 7 新特性: 创新型改变这个部分讨论先前划定的四个新特性。
1. 使用 随机数令牌(nonce)来阻止跨站请求伪造(CSRF)攻击Webopedia(在线计算机字典)这样定义跨站请求伪造(CSRF):“一种恶意攻击基于web的应用程序。一次典型的恶意攻击将迫使用户在登录可信任站点的时候执行一些不必要的操作。”对CSRF更形象的定义是 session riding(子乌注:好吧,这个“更形象”的定义我实在看不懂……可参看session riding)。
阻止CSRF的典型做法就是使用随机数令牌,在wikipedia中对它的定义是“一个 用于认证协议的随机或伪随机数,以确保老的通信不会在重播攻击中被复用。”
Tomcat 7 有一个servlet过滤器,用于在每次提交请求之后在用户的会话中保存一个随机数令牌。这个随机数令牌必须添加到后续的每一个请求中做为一个请求参数。这个servlet过滤器会检测这个请求参数是否与存储于用户会话中的随机数令牌一致。如果一致,请求就只能是来自指定站点。如果不同,这个请求会被认为是来自不同的站点并被拒绝。
servlet过滤器非常简单。这里有一个相关源码(来自 Apache Software Foundation CsrfPreventionFilter 文档)的片断:
ByteArrayInputStream bais = (ByteArrayInputStream)getServletContext().getResourceAsStream("/static/bg.png");(子乌注:我不太喜欢这种方式,这意味着将你的应用程序与Tomcat绑定,如果需要更换web容器的话,会是一个有些麻烦的事情。)使用这个别名而非httpd.conf中Apache别名的优势在于该映射资源可以从一个servlet中访问,而且这个别名能够被用于不是以Apache做前端服务器的应用程序。
Tomcat 7 加强:进化性改变这个部分将讨论前面定义的三个增强功能。
5. Servlet 3.0, JSP 2.2 和 JSP-EL 2.2 支持Servlet 3.0增强的部分:
能将添加注释的POJO作为servlet和(或)过滤器使用(不再需要web.xml)(子乌注:啊,我爱死这点了~~)可以在Web fragments中解析部署————Web fragments是只包含部分部署信息的XML文件。Servlet引擎根据这些Web fragments构造最终的web.xml。这个可以用来降低web.xml文件的复杂度。DevX 发布了一个很赞的关于 Servlet 3.0 变化的解释。
6. 更容易将Tomcat内嵌入你的应用程序Tomcat现在可以内嵌进一个应用程序,而且它可以通过编程进行配置及启动。CATALINA_HOME/conf/server.xml中的大部分配置可以通过编程完成。 在TOmcat 7之前,Tomcat 6提供了一个Embedd类,提供了便利的方法来配置Tomcat。这个类现在已经不推荐使用。新的类Tomcat使用了一些配置单元的默认值并提供了更简单易用的方法来内嵌Tomcat。
这里是一些来自CATALINA_HOME/conf/server.xml的Tomcat配置单元的常用结构和一些相关属性:
Language:??XML<Server> <Service> <Connector port="8080"> <Engine> <Host appBase="/home/avneet/work/tomcat7demo/dist" /> </Engine> </Connector> </Service></Server>
为了程序化的配置这些,你必须建立所有上述对象并配置他们,下面是一份完成这个工作的Java代码:
Language:??Javafinal String CATALINA_HOME = "/home/avneet/work/temp/tomcat7demo/"; Tomcat tomcat = new Tomcat(); tomcat.setBaseDir( CATALINA_HOME ); tomcat.setPort( 8080 ); tomcat.addWebapp("/tomcat7demo", CATALINA_HOME + "/webapps/tomcat7demo.war"); tomcat.start(); System.out.println("Started tomcat"); tomcat.getServer().await(); //保持Tomcat一直运行,直到被关闭 //Webapp tomcat7demo accessible at http://localhost:8080/tomcat7demo/7. 异步日志Tomcat 7 现在包含了一个异步文件日志记录器(AsyncFileHandler). AsyncFileHandler 扩展了 FileHandler 并能替换 FileHandler。要使用 AsyncFileHandler,只要简单地将CATALINA_HOME/conf/logging.properties文件中所有出现的FileHandler替换为AsyncFileHandler。应用程序必须使用 java.util.Logging; 因为Log4j还不支持异步日志记录。
当一个条日志信息发送给AsyncFileHandler时,日志信息会添加到一个 queue(java.util.concurrent.LinkedBlockingDeque),然后这个调用记录信息的方法会立刻返回,无须等待I/O到磁盘。当AsyncFileHandler被class loader加载时一个独立的线程会启动。这个线程从队列中读取日志信息并将其写入到磁盘。
这个方法的优势在于当I/O输出磁盘很慢的时候(例如,日志文件存放在远程驱动器上),日志记录不会拖慢请求处理。
AsyncFileHandler与队列之间采用生产者/消费者的关系来处理日志信息储存。标准的队列大小为10000。当溢出的时候,默认的行为是丢掉最后一条信息。默认大小和溢出行为都可以通过修改启动系统属性来配置。
关于 Tomcat 7 演示程序附件 Tomcat 7 Demo web应用程序有两个servlet。一个servlet演示如何使用随机数令牌来防止CSRF,第二个演示了别名的用法。更新 web/META-INF/context.xml 文件,指向images目录的绝对路径 (如 ./images).
使用build.xml来编译war文件,并将其部署到Tomcat 7上。使用下列两个URL来查看CSRF过滤以及alias使用:
http://localhost:8080/tomcat7demo/csrf/http://localhost:8080/tomcat7demo/alias/总结Tomcat团队介绍了Tomcat 7中的一些变化,包括了新的特性和对现有功能的强化。当这篇文章写下的时候这些变化还没有时间在生产系统中测试(最新的稳定版是7.0.2), team introduced several changes in Tomcat 7 in terms of both new features and enhancements to existing features. The changes had not been tested in production systems at time of writing (the latest stable release was 7.0.2), 但只要6-12个月,他们将成为主流并让程序员们更容易地部署更安全、高质量的基于Java的web应用。
关于作者Avneet Mangat拥有9年的Java/J2EE开发经验,目前是在伦敦工作的独立IT顾问。他拥有一个牛津大学的软件工程硕士学位,通过了(Sun-Certified Java Programmer)、SCWCD(Sun-Certified Web Component Developer)、SCEA(Sun-Certified Enterprise Architect)和ACFD(Adobe-certified Flash Designer)认证,以及Prince2认证(基金会)。他是开源工具DBBrowser的首席开发者。(子乌注:我一般不在这里写注释,不过……看到这位仁兄的认证,我觉得我过去的那么多年都活到狗身上去了……我不蛋定了>_<)