Tomcat 7 的七大新特性

  • 格式:docx
  • 大小:29.50 KB
  • 文档页数:8

英文原文:Top 7 Features in Tomcat 7: The New and the ImprovedTomcat的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内嵌到应用去中去,比如JBoss7 异步日志记录根据Mark Thomas,Tomcat 7委员会的经理的说法,Tomcat 7最显著的三个特征是Servlet 3.0,内存检测泄露和增强的安全特性。

Tomcat 7的例子程序中,包含了Eclipse的工程文件和Ant的构建文件,以方便去构建war文件。

其中Eclipse工程文件有例子代码描述了Tomcat 7的一些新特性。

下面逐一开始介绍。

TOMCAT 7新特性1、使用随机数去防止跨站请求伪造攻击。

Wikipedia将跨站请求伪造攻击(Cross Site Request forgery,CSRF)定义为:“一种影响Web应用的恶意攻击。

CSRF让用户当进入一个可信任的网页时,被强行执行恶意代码。

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

”Tomcat 7中有一个servlet过滤器,用于将随机数存储在用户每次请求处理后的seesion会话中。

这个随机数,必须作为每次请求中的一个参数。

Servlet 过滤器然后检查在请求中的这个随机数是否与存储在用户session中的随机数是一样的。

如果它们是相同的,该请求是判断来自指定的网站。

如果它们是不同的,该请求被认为是从其他网站发出并且会被拒绝。

这个servlet过滤器是十分简单的,下面是从TOMCAT 源代码CsrfPreventionFilter文档中摘录的片段:Java代码1.public class CsrfPreventionFilter extends FilterBase {2.3.public void doFilter(ServletRequest request, ServletResponseresponse,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);所以每个URL地址中都有一个从用户session中提取的随机数,下面是使用的JSTL例子:在以前,JSTL中构造链接可以这样:< c:url var="url" value="/show" >< c:param name="id" value="0" / >< /c:url>< a href="${show}" >Show< /a >而现在可以这样:< c:url var="url" value="/show" >< c:param name="id" value="0" / >< c:param name="org.apache.catalina.filters.CSRF_NONCE"value="${.apache.catalina.filters.CSRF_NONCE}" / >< /c:url>具体的例子可以参考TOMCAT 7自带例子中的演示,这个过滤器可以在web.xml中进行配置,配置后,所有访问如http://localhost:8080/tomcat7demo/csrf/的都必须带上参数,不带上参数的话会出现403禁止访问错误。

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

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

Session劫持攻击通常是以下的情况:1 恶意攻击者先访问一个网页,由于cookie是以jsession id的方式存储在浏览器中的,即使攻击者不登陆,他可以伪造一个带有jsession id的地址,把它发给受害者,比如/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在幕后所做的,开发者根本不用去理会。

3 、内存泄露的侦测和防止开发者在部署他们写的程序到生产环境上时,经常会遇到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 文件中读取资源4、在war文件外使用别名去存储静态内容Web应用程序需要静态资源文件,比如象CSS,Javascript和视频文件、图片文件等。

通常都把它们打包放在war文件中,这将增加了WAR文件的大小并且导致很多重复的加载静态资源。

一个比较好的解决方法是使用Apache HTTP服务器去管理这些静态文件资源,下面是一个apache httpd.conf文件的配置摘录:< Directory "/home/avneet/temp/static" >Order allow,denyAllow from all< /Directory >Alias /static "/home/avneet/temp/static"以上的设置,使得访问http://localhost/static时,能访问到放在/home/avneet/temp/static下的资源。

允许使用新的aliases属性,指出静态文件资源的位置,可以通过使用Classloader.getResourceAsStream('/static/...')或者在链接中嵌入的方法让TOMCAT去解析绝对路径,下面是一个在context.xml中配置的例子:< ?xml version="1.0" encoding="UTF-8"? >< Context path="/tomcat7demo"aliases="/static=/home/avneet/temp/static" >< /Context >假设/home/avneet/temp/static这个文件夹存放有一张图片bg.png,如果war文件以tomcat7demo的名字部署,那么可以通过以下三个方式去访问这张图片1 直接访问http://localhost:8080/tomcat7demo/static/bg.png2 在HTML链接中访问:<imgsrc="/tomcat7demo/static/bg.png" / >3 通过JAVA代码访问: ByteArrayInputStreambais = (ByteArrayInputStream)getServletContext().getResourceAsStream("/stati c/bg.png");使用aliases的好处是可以代替Apache的httpd.conf的设置,并且可以在servlet容器范围内访问,并且不需要Apache。