阅读更多

103顶
4踩

编程语言

原创新闻 Tomcat 7 的七大新特性

2010-09-29 12:05 by 见习记者 jackyrong 评论(36) 有68102人浏览

英文原文:Top 7 Features in Tomcat 7: The New and the Improved

 

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新特性

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

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

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

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

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

public class CsrfPreventionFilter extends FilterBase { 

public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) throws IOException, ServletException { 

String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM); 
String expectedNonce = (String) req.getSession(true).getAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME); 

if (expectedNonce != null && !expectedNonce.equals(previousNonce)) { 
res.sendError(HttpServletResponse.SC_FORBIDDEN); 
return; 
} 

String newNonce = generateNonce(); 
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="${session.org.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的地址,把它发给受害者,比如

  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在幕后所做的,开发者根本不用去理会。

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,deny
Allow 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.png

  2 在HTML链接中访问:< img src="/tomcat7demo/static/bg.png" / >

  3 通过JAVA代码访问: ByteArrayInputStream bais = (ByteArrayInputStream)getServletContext().getResourceAsStream("/static/bg.png");

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

  TOMCAT 7的增强特性

5、对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重写。


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

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

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

< Server >
< Service >
< Connector port="8080 >
< Engine >
< Host appBase="/home/avneet/work/tomcat7demo/dist" / >
< /Engine >
< /Connector >
< /Service >
< /Server >

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

final 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(); //Keeps Tomcat running until it is shut down
//Webapp tomcat7demo accessible at http://localhost:8080/tomcat7demo/

7 、异步日志记录

  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/

  • 大小: 106.8 KB
103
4
评论 共 36 条 请登录后发表评论
36 楼 xiaowanghappy 2015-02-15 08:54
啥时候支持JTA?
35 楼 cfying 2011-10-25 10:08
你好,我遇到 hibernate导致tomcat内存暴涨,页面反应速度减慢 这样的问题,做压力测试模拟20个人同时访问,大概4个小时tomcat内存就溢出了。
 
我的项目是:
      spring + hibernate + mysql5.1 + tomcat6.0.28
34 楼 d4rkl0r0 2011-03-15 14:31
现在用7经常报Pemgen错误:OutOfMemoryError

反而用6还没遇到郭。。
33 楼 dryZeng 2011-01-21 13:21
英文原文是:
A Malicious user visits a website. A cookie is stored with the jsessionidin the browser -- even if the user doesn't log in. He then crafts a URL with the jsessionid in the URL and sends it to the victim (e.g. http://example.com/login?JESSIONID=qwerty).


应该可以这样理解:

一个恶意攻击者(想用你的权限进入http://example.com/)访问http://example.com/站点。一个带有他的sessionid的cookie会被保存在他的浏览器中,即使他没有登陆(而只是访问登陆页面)。
然后他(在他计算机里得到此sessionid)构造一个URL如:http://example.com/login?JESSIONID=qwerty(他的sessionid),发给你,让你通过此URL去访问并登陆。

最终结果是:他这样就和你使用一个sessionid登陆站点http://example.com/了。
然后他就可以以你的身份做你有权限做的任何事情。
32 楼 JavaTestJava 2010-11-02 11:15
或者说:

A Malicious user visits a website. A cookie is stored with the jsessionidin the browser -- even if the user doesn't log in.



恶意用户甚至可以不登录网站,仅仅需要通过浏览器中保存在cookie文件里jessionid就可以登录该网站
31 楼 JavaTestJava 2010-11-02 11:13
edg_edu 写道
lym6520 写道
mlw2000 写道
误人子弟啊,看下面这段:
引用

恶意攻击者先访问一个网页,由于cookie是以jsession id的方式存储在浏览器中的,,即使攻击者不登陆,...


英文原文是:
引用

A Malicious user visits a website. A cookie is stored with the jsessionidin the browser -- even if the user doesn't log in.

lz这句话翻译的确实有问题,错了大家帮着改!不错。



哪位可以专家再翻一下呢?


一个恶意用户可以通过jseesionid 保存在浏览器的cookie文件里的信息访问改网站,甚至都不需要此用户登录
30 楼 mpqi 2010-10-31 16:29
tomcat 很精巧! 继续关注。 防御机制依旧有待观瞻。
29 楼 yq12010902 2010-10-29 20:39
为啥子 我启动tomcat的时候用那么长时间了   
28 楼 xueweiabcok 2010-10-25 13:22
27 楼 edg_edu 2010-10-14 08:16
lym6520 写道
mlw2000 写道
误人子弟啊,看下面这段:
引用

恶意攻击者先访问一个网页,由于cookie是以jsession id的方式存储在浏览器中的,,即使攻击者不登陆,...


英文原文是:
引用

A Malicious user visits a website. A cookie is stored with the jsessionidin the browser -- even if the user doesn't log in.

lz这句话翻译的确实有问题,错了大家帮着改!不错。



哪位可以专家再翻一下呢?
26 楼 chenshengzun 2010-10-12 09:22
希望不会因为多次重启Tomcat而导致内存泄露
25 楼 huhu359819176 2010-10-11 15:28
TOMCAT是越來越先進了,支持!
24 楼 wanglu271991027 2010-10-10 10:30
23 楼 彬彬AtdayOfMay 2010-10-10 00:00
还不是很懂,刚刚接触tomcat,来看看
22 楼 wenxiang_tune 2010-10-09 19:43
各有各的优点,不要争了
21 楼 ahead_zhan 2010-10-09 09:42
主流的产品,一直的趋势,不用怀疑TOMCAT
20 楼 liyaxi 2010-10-01 13:33
tomcat 我一直在用感觉好处是内存消耗的比较少。
19 楼 麦蒂粉丝 2010-10-01 12:43
还不会用,,,,
18 楼 treblesoftware 2010-10-01 00:08
TOMCAT应该把某些模块彻底的从新设计。提升部分性能。
17 楼 下载的爱 2010-09-30 22:40
不错,Tomcat现在越来越好了。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • JK.rar_IIS Apache JK

    Tomcat与Apache或IIS集成的JK插件,并给出了5.0的tomcat及apache服务器,可直接集成使用。集成后,对开发大任务量WebServer程序很有用!

  • Apache与IIS的客观对比(不比不知道,一比吓一跳)

    Apache与IIS的优劣对比 对于中小企业来说建立自己的网站,对外展示自己的页面是最平常不过的事情了。目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。 一、免费与收费之争: 虽然很多用户都使用IIS建立网站,他是集成于Windows操作系统中的组件。不过要想合法使用I

  • 用IIS和Apache搭建Web服务器入门.doc

    用IIS和Apache搭建Web服务器入门.doc

  • Apache与IIS的优劣对比点点评分析

    对于中小企业来说建立自己的网站,对外展示自己的页面是最平常不过的事情了。目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。   一、免费与收费之争:   虽然很多用户都使用IIS建立网站,他是集成于Windows操作系统中的组件。不过要想合法使用IIS就要购买正版Windows操作系统。   反观Apache,他是完全免费的。不需要支付任何费用就可以免费下载并使用了。   结论——Apache免费,IIS收费,前者占优。   二、稳定性:   接下来要比较的就是稳定性了,WWW服务要随时运转正常,一个

  • Win10下的IIS的配置

    Win10下的IIS的配置 1.鼠标放置 “此电脑” 上,右击,点击 “属性” ,结果,如下图: 2.打开 “控制面板主页”,点击 “程序”,如下图: 3.点击 “启用或关闭 Window 功能” ,如下图: 4.勾选如下图所示的项目,即可装上IIS,安装之后,重启计算机。 5.右击 “此电脑”,点击 “管理”,结果,如下图: 6.在 “添加网站” 中,填入网站名称与基本信息,如下图: ...

  • apache和IIS区别?内网本地服务器项目怎么让外网访问?

    Apache的应用范围就比较广泛了,不仅能够支持windows操作系统,并且也能在unix,linux和freebsd上面运行,并且支持http1.1标准,以及多种脚本语言,如perl php jsp等。很多软件都会存在着源代码是否开放的区别,windows的操作系统并不是开源的操作系统,为她服务的IIS也不是开源的web服务。在使用web服务器之前都需要进行配置,在配置方便性方面,IIS的配置比较简单,但是在使用的过程中容易出现服务器内部错误(500错误),有时还会发生假死的情况。

  • Apache与IIS:探索服务器市场的两大巨头

    在上面的配置中,我们指定了服务器的名称为"localhost",并将文档根目录设置为"/var/www/html"。此外,我们还为该目录指定了一些选项,例如"Indexes"允许目录浏览,"FollowSymLinks"允许跟随符号链接,"AllowOverride All"允许使用.htaccess文件进行配置。无论选择哪个,这两个服务器都提供了丰富的功能和灵活的配置选项,可满足各种Web应用程序的需求。在上面的配置中,我们通过将"enabled"属性设置为"true"来启用目录浏览。

  • SpringBoot自动配置原理(每一步都有说明哦)

    SpringBoot自动配置原理 在SpringBoot启动主配置类时,@SpringBootApplication 注解发挥作用进行自动配置。 @SpringBootApplication 注解中,比较重要的有如下两个注解,实际发挥自动配置作用作用的是 @EnableAutoConfiguration 注解 而在@EnableAutoConfiguration 中,@Import导入了一个自动配置选择器类 AutoConfigurationImportSelector。 进入这个自动配置选择器类,可

  • Web服务器之争:Nginx达到33.3%,而Apache则衰落至不足50%

    有着诸多优势的Nginx如今已是增长最快的Web服务器了,截止今年4月,7年前仅有3.9%占有率的Nginx已经增长到如今的33.3%,这代表着平均每分钟就有一个排名前1000万以内的网站改弦更张,将老服务器替换成Nginx。而相对同样快速增长的Web服务器Node.js,改用Nginx的网站达到了改用Node.js网站数量的70倍。\\此外,自2010年以来,Apache的市场份额从71.5%下...

  • mvc1 mvc2 mvc3 知识小差异,服务器上如何配置 mvc3 IIS6,IIS7.5 上部署 mvc3 和 silverlight...

    mvc1 是 2009年推出的,但是已经被淘汰了 mvc2 不好用,里面很多 &lt;%%&gt; 这样的代码 mvc3 是在.net 4.0的环境里面的,用的是 razor 引擎。 @ 特性 如何从mvc2 升级到 mvc3 呢? 首先,把mvc2的 .net 3.5 转换为 .net 4.0 ,然后关掉vs,用一个 exe的转换软件,对 刚才的 .net 4.0的 m...

  • Asp.Net 请求处理过程(IIS 6)

    一: IIS与ASP.NET之间的处理 IIS 5 这里就不讨论了,实际生产环境下已经基本被淘汰,我们看IIS 6(暂时不讨论IIS 7的集成模式)的ASP.net 请求处理过程如图1 图 1 首先,我们通过一个URL地址访问网站,此时通过DNS的解析, 找到主机的IP地址,主机操作系统(只针对Windows)系统中的http.sys组件会监听到这个请求。 ...

  • Visual FoxPro已经过时了吗 ?我也经常问自己!

    恕我直言,这样的问题我真的听腻了。这个问题我听了好几年了。从谣言出现到今天Visual FoxPro的版本已经生了两次变化,就是Visual FoxPro 6.0 与2001年春天推出的Visual FoxPro 7.0。根据微软的官方消息,Visual FoxPro 8(可能是这个名称吧)已经在研发之中了。我不敢保证是否会有Visual FoxPro 9.0(这就像我不敢保证微软是否在那时还存在...

  • webService淘汰了吗?

    当代开发者们已经很少见到相关的webService开发了,那么是该技术已经被淘汰了吗?先让我们来看看其和http接口的优劣吧,这里着重说webService,该服务协议为SOAP(简单对象访问协议),说白了就是http  POST的一个专用版本,当时将header中的一个属性Content-Type设置为text/xml,那么你将要传输的文本会被格式化为xml形式,乍一看,XML?好老哦,确实,现...

  • Apache的作用及意义

      Apache服务器只是作为一个转接url的服务器,根据客户端发送的url,转接到对应的运行服务器(比如:tomcat自带的服务器)中进行相应的运行操作。   使用Apache的好处,可以隐藏掉运行服务的url,提高安全性;同时,Apache可以拓展更多的功能应用服务,提高web项目功能。   以上只是本人个人理解,如有不到之处,望能给出建议! 转载于:https://ww...

Global site tag (gtag.js) - Google Analytics