`

Tomcat7 七大新特性和新增功能

阅读更多

 

Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们,或指出它们的不足,或提供代码示例。本文将明确描述Tomcat 7中七个最显著的特征和新增的功能,并对其作出评论,而不是仅仅列出新的功能。本文还提供了代码例子以方便你可以对其有更好的理解。

本文分为两个部分,分别是”Tomcat 7的新特性”和“Tomcat 7增强的功能”。

Tomcat 7新特性

1 使用随机数去防止跨站脚本攻击。

2 改变了安全认证中的jessionid的机制,防止session攻击。

3 内存泄露的侦测和防止

4 在war文件外使用别名去存储静态内容。

Tomcat 7的增强功能

5 对Servlet 3.0,JSP 2.2和JSP-EL 2。2的支持

6 更容易将Tomcat内嵌到应用去中去,比如JBoss

7 异步日志记录

根据Mark Thomas,Tomcat 7委员会的经理的说法,Tomcat 7最显著的三个特征是Servlet 3.0,内存检测泄露和增强的安全特性。

Tomcat 7的例子程序中,包含了Eclipse的工程文件和Ant的构建文件,以方便去构建war文件。其中Eclipse工程文件有例子代码描述了Tomcat 7的一些新特性。

下面逐一开始介绍。

Tomcat 7新特性

一、使用随机数去防止跨站请求伪造攻击

Wikipedia将跨站请求伪造攻击(Cross Site Request forgery,CSRF)定义为:“一种影响Web应用的恶意攻击。CSRF让用户当进入一个可信任的网页时,被强行执行恶意代码。

经典的防止CSRF攻击的方法是使用随机数的方式,Wikipedia中定义为“利用随机或伪随机数嵌入到认证协议中,以确保旧的不能在以后的重放攻击中被利用。”

Tomcat 7中有一个servlet过滤器,用于将随机数存储在用户每次请求处理后的seesion会话中。这个随机数,必须作为每次请求中的一个参数。 Servlet过滤器然后检查在请求中的这个随机数是否与存储在用户session中的随机数是一样的。如果它们是相同的,该请求是判断来自指定的网站。如果它们是不同的,该请求被认为是从其他网站发出并且会被拒绝。

这个servlet过滤器是十分简单的,下面是从TOMCAT 源代码CsrfPreventionFilter文档中摘录的片段:

  1. public class CsrfPreventionFilter extends FilterBase {  
  2.  
  3. public void doFilter(ServletRequest request, ServletResponse response,  
  4. FilterChain chain) throws IOException, ServletException {  
  5.  
  6. String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);  
  7. String expectedNonce = (String) req.getSession(true).getAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME);  
  8.  
  9. if (expectedNonce != null && !expectedNonce.equals(previousNonce)) {  
  10. res.sendError(HttpServletResponse.SC_FORBIDDEN);  
  11. return;  
  12. }  
  13.  
  14. String newNonce = generateNonce();  
  15. req.getSession(true).setAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME, newNonce);  
  16.  

所以每个URL地址中都有一个从用户session中提取的随机数,下面是使用的JSTL例子:

在以前,JSTL中构造链接可以这样:

  1. < c:url var="url" value="/show" > 
  2. < c:param name="id" value="0" / > 
  3. < /c:url > 
  4. < a href="${show}" >Show< /a > 
  5.  

而现在可以这样:

  1. < c:url var="url" value="/show" > 
  2. < c:param name="id" value="0" / > 
  3. < c:param name="org.apache.catalina.filters.CSRF_NONCE" value="${session.org.apache.catalina.filters.CSRF_NONCE}" / > 
  4. < /c:url > 
  5.  

具体的例子可以参考Tomcat 7自带例子中的演示,这个过滤器可以在web.xml中进行配置,配置后,所有访问如:http://localhost:8080/tomcat7demo/csrf/的都必须带上参数,不带上参数的话会出现403禁止访问错误。

当然这种方法的缺点就是所有的链接都必须带上这个随机数。

二、改变了安全认证中的jessionid的机制,防止session攻击

Session劫持攻击通常是以下的情况:

1 恶意攻击者先访问一个网页,由于cookie是以jsession id的方式存储在浏览器中的,即使攻击者不登陆,他可以伪造一个带有jsession id的地址,把它发给受害者,比如:http://example.com/login?JESSIONID=qwerty

2 受害者点这个带有jsessionid的链接,提示输入验证信息之后就登陆系统

3 攻击者现在使用这个带jsessionid的链接,以受害者的身份登陆进系统了。

对于攻击者来说,将jsessionid加在url中以及通过一个恶意表单发送出去是很容易的事,对于session劫持攻击的更详细描述,请参考Acros Security组织的白皮书“Session Fixation Vulnerability in Web-based Applications”。

Tomcat 7对此的解决方案是一个补丁,它在验证后改变了jsessionid。这个补丁主要是应用在Tomcat 7中,当然在TOMCAT 5和6中也可以使用但只是有些不同。

根据Mark Thomas说的,应用了Tomcat 7的这个补丁后:

◆ TOMCAT默认情况下安全性不再变得脆弱,因为验证后会话发生了变化

◆ 如果用户改变了默认设置(比如应用程序不能处理变化了的session id),风险也会降到最小,因为在Servlet 3中,可以禁止在url中进行会话跟踪。

而在TOMCAT 5和TOMCAT 6中,应用了补丁后:

◆ 能阻止session劫持攻击,因为能让TOMCAT在验证后改变session id。

◆ 如果应用程序不能处理变化了的session id,可以通过写自定义的过滤器去检查request.isRequestedSessionIdFromURL()和其返回的结果,以降低风险。

以上这些改变都是TOMCAT在幕后所做的,开发者根本不用去理会。

三、内存泄露的侦测和防止

开发者在部署他们写的程序到生产环境上时,经常会遇到Pemgen错误:OutOfMemoryError。这是由于内存泄露而引起的。通常开发者是通过增大permgen内存的大小去解决或者就是重新启动tomcat。

Tomcat 7包含了一个新的特性,它通过把不能垃圾回收的引用对象移走的方法,能解决一些Permgen内存泄露的问题。这个特性对程序员部署应用程序在他们的开发环境中是十分方便的,因为程序员在开发环境中为了节省时间一般不重新启动Tomcat就能部署新的war文件。在生产环境中,最好的建议还是停掉TOMCAT,然后清除work下面的目录文件并且重新部署应用。

当然,内存泄露检测和防止这个特性现在还不是很完善,还是有的情况TOMCAT不能检测内存泄露和修复之的,所以对于生产环境,最好的的办法还是停掉TOMCAT,然后清除work下面的目录文件并且重新部署应用。

Mark Thomas解析应用程序或者库程序在如下情况下会触发内存泄露:

◆ JDBC驱动的注册

◆ 一些日志框架

◆ 在ThreadLocals中保存了对象但没有删除它们

◆ 启动了线程但没停止

而 Java API 存在内存泄漏的地方包括:

1.使用 javax.imageio API ( Google Web Toolkit会用到)

2.使用 java.beans.Introspector.flushCaches()

3.使用 XML 解析器

4.使用 RMI 远程方法调用

5.从 Jar 文件中读取资源

四、在war文件外使用别名去存储静态内容

Web应用程序需要静态资源文件,比如象CSS,Javascript和视频文件、图片文件等。通常都把它们打包放在war文件中,这将增加了WAR文件的大小并且导致很多重复的加载静态资源。一个比较好的解决方法是使用Apache HTTP服务器去管理这些静态文件资源,下面是一个apache httpd.conf文件的配置摘录:

  1. < Directory "/home/avneet/temp/static" > 
  2. Order allow,deny  
  3. Allow from all  
  4. < /Directory > 
  5. Alias /static "/home/avneet/temp/static"  
  6.  

以上的设置,使得访问http://localhost/static时,能访问到放在/home/avneet/temp/static下的资源。

允许使用新的aliases属性,指出静态文件资源的位置,可以通过使用Classloader.getResourceAsStream('/static/...')或者在链接中嵌入的方法让TOMCAT去解析绝对路径,下面是一个在context.xml中配置的例子:

  1. < ?xml version="1.0" encoding="UTF-8"> 
  2. < Context path="/tomcat7demo" aliases="/static=/home/avneet/temp/static" > 
  3. < /Context > 
  4.  

假设/home/avneet/temp/static这个文件夹存放有一张图片bg.png,如果war文件以tomcat7demo的名字部署,那么可以通过以下三个方式去访问这张图片

1 直接访问:http://localhost:8080/tomcat7demo/static/bg.png

2 在HTML链接中访问:

  1. < img src="/tomcat7demo/static/bg.png" / > 

3 通过JAVA代码访问:

  1. ByteArrayInputStream bais = (ByteArrayInputStream)getServletContext().getResourceAsStream("/static/bg.png");  

使用aliases的好处是可以代替Apache的httpd.conf的设置,并且可以在servlet容器范围内访问,并且不需要Apache。

Tomcat 7的增强特性

五、对Servlet 3.0,JSP 2.2和JSP-EL 2.2的支持

Servlet 3的增强特性有:

◆ 可以在POJO或者过滤器filters中使用annotations注释(在web.xml中不再需要再进行设置了)

◆ 可以将web.xml分块进行管理了。也就是说,用户可以编写多个xml文件,而最终在web.xml中组装它们,这将大大降低web.xml的复杂性增强可读性。比如, struts.jar和spring-mvc.jar每一个都可以有一个web-fragment.xml。开发者不再需要在web.xml中去配置它们了,在web-fragment.xml中的jar文件会自动加载,并且struts/spring-mvc servlets和filters也会自动装配设置。

◆ 异步处理web的请求----这个特性在tomcat 6 中已经有了,现在在Tomcat 7中以Servlet 3标准规范化了,能让使用异步I/O的web应用程序可以移植到不同的web容器中。异步处理使用非阻塞I/O,每次的HTTP连接都不需要对应一个线程。更少的线程可以为更多的连接提供服务。这对于需要长时间计算处理才能返回结果的情景来说是很有用的,比如产生报表,Web Servce调用等。

◆ 安全的增强---Servlet 3.0现在使用SSL 去加强了会话session的跟踪,代替了原来的cookie和URL重写。

六、更容易将Tomcat内嵌到应用去中去

Tomcat 7现在可以嵌入到应用程序中去,并可以通过程序去动态设置和启动。象在CATALINA_HOME/conf/server.xml中的很多配置,现在都可以用程序动态去设置了。在Tomcat 7前,Tomcat 6提供了一个嵌入类,它能方便地去配置Tomcat。但在Tomcat 7中,这个类已被废弃了。这个新的Tomcat 7的类,使用了几个默认的配置元素,并提供了一个更容易和简单的方法去嵌入Tomcat。

下面是CATALINA_HOME/conf/server.xml中的一些相关属性和配置:

  1. < Server > 
  2. < Service > 
  3. < Connector port="8080 > 
  4. < Engine > 
  5. < Host appBase="/home/avneet/work/tomcat7demo/dist" / > 
  6. < /Engine > 
  7. < /Connector > 
  8. < /Service > 
  9. < /Server > 
  10.  

我们可以通过程序去进行动态设置了:

  1. final String CATALINA_HOME = "/home/avneet/work/temp/tomcat7demo/";  
  2. Tomcat tomcat = new Tomcat();  
  3. tomcat.setBaseDir( CATALINA_HOME );  
  4. tomcat.setPort( 8080 );  
  5. tomcat.addWebapp("/tomcat7demo", CATALINA_HOME + "/webapps/tomcat7demo.war");  
  6. tomcat.start();  
  7. System.out.println("Started tomcat");  
  8. tomcat.getServer().await(); //Keeps Tomcat running until it is shut down  
  9. //Webapp tomcat7demo accessible at http://localhost:8080/tomcat7demo/  
  10.  

七、异步日志记录

Tomcat 7现在包括了一个异步日志记录器(AsyncFileHandler)。AsyncFileHandler继承了FileHandler类并能代替FileHandler。使用AsyncFileHandler,时,只需要在CATALINA_HOME/conf/logging.properties中把FileHandler全部替换为AsyncFileHandler就可以了。要注意的是异步日志不能跟log4一起工作。

当有日志发向AsyncFileHandler时,日志被加入到队列中(java.util.concurrent.LinkedBlockingDeque)并且方法调用的信息会马上返回不需要等待I/O写到磁盘中。当类加载器加载AsyncFileHandler时,会有一个单独的线程启动,这个线程会从队列中读取日志信息并且写到磁盘中去

这种方法的好处是如果I/O速度很慢(比如日志要保存在远端的设备上)时,记录日志的请求和处理过程不会显得很慢。

AsyncFileHandler使用生产者和消费者的关系原理,在队列中存储日志信息。队列默认大小为10000。为了预防队列溢出,默认是丢弃最后的信息。默认的队列大小和溢出的设置都可以通过启动参数进行设置。

关于Tomcat 7的示例程序

Tomcat 7的自带程序例子有两个servlets,一个是演示了如何采用随机数的办法防止CSRF攻击,另外一个是描述了使用aliases。更新一下web/META-INF/context.xml,指出图片的绝对路径即可顺利运行。

通过ant运行build.xml去将它们部署到Tomcat 7中,使用如下两个地址访问:

◆ http://localhost:8080/tomcat7demo/csrf/

◆ http://localhost:8080/tomcat7demo/alias/

分享到:
评论

相关推荐

    Tomcat 7 的七大新特性

    以下是对Tomcat 7七大新特性的详细说明: 1. **改进的WebSocket支持**: Tomcat 7开始支持JavaScript API for WebSocket(JSR 356),为Web应用程序提供了低延迟、双向通信的能力。WebSocket允许创建持久连接,...

    tomcat7最新版本

    【标题】"Tomcat7最新版本"涉及到的是Apache Tomcat服务器的第七个主要版本,即7.0.26。Tomcat是一款广泛使用的开源Java Servlet容器,它实现了Java EE的Servlet和JavaServer Pages (JSP) 规范,用于部署和运行Java ...

    linux64_tomcat7

    Tomcat 7引入了许多新特性,如改进的JMX(Java Management Extensions)支持,增强了管理工具,提升了性能,并对Servlet 3.0、JSP 2.2和EL 2.2等规范进行了支持。这些更新使得Tomcat 7成为开发和部署现代Java Web...

    tomcat7 tomcat9 两个资源

    标题中的“tomcat7 tomcat9 两个资源”指的是Apache Tomcat服务器的第七个和第九个主要版本。Tomcat是一款开源的Java Servlet容器,主要用于部署和运行Java Web应用程序。这两个版本之间的差异在于功能的增强、性能...

    Tomcat7 32位

    Tomcat7相较于之前的版本,引入了许多新特性和改进。例如,它支持Servlet 3.0、JSP 2.2和EL 2.2规范,这使得开发者可以利用更多的高级功能,如异步处理、过滤器链的改进和更强大的表达式语言。同时,Tomcat7优化了...

    服务器压缩包tomcat-7

    "Tomcat-7"是我们讨论的重点,这个版本是Tomcat服务器的第七个主要版本,发布于2013年,提供了许多新功能和改进,旨在提高性能、安全性和稳定性。 1. **Servlet 3.0支持**:Tomcat 7支持Servlet 3.0规范,带来了...

    Tomcat7_64bit

    Tomcat7是Tomcat的第七个主要版本,引入了许多新特性和性能改进,如对JSP2.2和Servlet3.0的支持,以及更好的管理和监控工具。64位版本则意味着它可以利用64位操作系统的内存管理能力,处理更大规模的应用和数据。 ...

    tomcat7,正常,可用,需要jdk1.6版本

    【标题】"Tomcat7, 正常, 可用, 需要JDK1.6版本" 暗示了我们讨论的核心是Apache Tomcat服务器的第七个主要版本,一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web应用服务规范。此版本的Tomcat被认为稳定...

    Tomcat7.x 64位系统

    - “Tomcat 7.x”:这是Tomcat的第七次重大更新,引入了许多新特性和改进,包括对Servlet 3.0、JSP 2.2和EL 2.2规范的支持,增强了安全管理,以及性能优化。 - “Tomcat7”:是Tomcat7.x的简称,通常用于指代这个...

    apache-tomcat-7.0.82.tar.gz 【Tomcat服务器,Tomcat7 Linux版】

    Tomcat 7相对于之前的版本在性能和稳定性上有所提升,并且增加了一些新特性,例如对WebSocket协议的支持。 Linux作为操作系统,以其稳定性和安全性被广泛应用于服务器环境。将Apache Tomcat部署在Linux上,可以充分...

    JDK7+TOMCAT7.zip

    【TOMCAT7】是Apache Tomcat服务器的第七个主要版本,是一个开源的Java Servlet容器,实现了Java EE的Web部分,特别是Servlet和JSP规范。Tomcat7的主要特点和改进有: 1. **多线程处理**:Tomcat7支持多线程处理...

    tomcat7_win_64bit

    Tomcat 7是Tomcat服务器的第七个主要版本,它包含了众多新特性和改进,例如对Java EE 6 Web Profile的支持,这使得开发者可以在不依赖完整的Java EE应用服务器的情况下,开发和部署符合规范的Web应用程序。...

    apache-tomcat6and7

    总结来说,Apache Tomcat 6和7是开发和部署Java Web应用程序的强大工具,它们提供了稳定的平台和丰富的功能。不过,考虑到安全性和技术进步,建议使用最新维护的版本,如Apache Tomcat 9或更高版本。

    Tomcat7.0和8.0版本

    Tomcat 7.0是Apache Tomcat的第七个主要版本,它引入了许多增强功能和改进。7.0.40是这个版本的一个稳定更新,提供了对Java EE 6的支持,包括Servlet 3.0、JSP 2.2和EL 2.2标准。以下是一些关键特性: 1. **Servlet...

    tomcat7和8压缩包

    这个"tomcat7和8压缩包"包含了Tomcat服务器的第七版和第八版的安装文件。这两个版本在Java Web开发领域中广泛应用,为开发者提供了运行和部署Java应用程序的平台。 Tomcat 7是2010年发布的,它基于Java EE 6规范,...

    tomcat7 tomcat 6 xshell6.zip

    【标题与描述解析】 标题"tomcat7 tomcat 6 xshell6.zip"表明这是一个包含Tomcat 7、Tomcat 6以及xShell 6的压缩包文件。Tomcat是Apache软件基金会的一个...了解每个组件的功能和特性对于有效利用这些工具至关重要。

    tomcat7_32位_解压缩版

    【描述】"tomcat7.0解压缩版,应该是32位的,正在使用的" 提示我们这个版本是7.0,这是Tomcat的一个重要里程碑,因为它引入了许多新特性和改进。7.0版本对Servlet 3.0、JSP 2.2和EL 2.2标准提供了支持,这使得开发和...

    tomcat 7.0

    1. 支持Servlet 3.0:Tomcat 7引入了Servlet 3.0规范,提供了诸如异步处理、过滤器链的优化、注解支持等新功能,让开发者编写Web应用更为便捷。 2. JSP 2.2:Tomcat 7支持JSP 2.2规范,允许在JSP页面中使用注解,...

    tomcat 7 网站开发工具

    标题中的“Tomcat 7 网站开发工具”指的是Apache Tomcat服务器的第七个主要版本,这是一个开源软件,用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。Tomcat是Java EE(现在称为Jakarta EE)的一部分...

Global site tag (gtag.js) - Google Analytics