Tomcat 7 released!

原创 2011年01月16日 22:03:00

废话一概不说,Change Log见此: http://tomcat.apache.org/tomcat-7.0-doc/changelog.html

看看都有什么新Feature(最显著的三个特征是Servlet 3.0,内存检测泄露和增强的安全特性):

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

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

3. 内存泄露的侦测和防止;

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

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

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

7 异步日志记录。

详细分解:

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

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

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

String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);       String expectedNonce = (String) req.getSession(true).getAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME); 
  •  
    •  
      •  
        •  
          •  
            •           < 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 >

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

原来的问题就是Cookie的JSESSIONID参数被其他主机劫持,问题很简单,看看是怎么解决的:

Tomcat 7对此的解决方案是一个补丁,它在验证后改变了jsessionid。也就是说,如果原jsessionid的用户并不在线,那么上线创建会话时验证用户,如果发现他是一个合法者,除了允许访问外,原有jsessionid废除,使用新值。由此可见,倘若该用户会话属于存活状态,如果第三方主机会话劫持并以该用户访问Tomcat,其安全机制并无法起到作用。

3. 内存泄露的侦测和防止:

只有有限的能力,包括部分如下情形:

• JDBC驱动的注册

• 一些日志框架

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

• 启动了线程但没停止

以及部分 Java API 存在内存泄漏的场景:

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

使用 java.beans.Introspector.flushCaches()

使用 XML 解析器

使用 RMI 远程方法调用

从 Jar 文件中读取资源

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

Web应用程序需要静态资源文件,比如象CSS,Javascript和视频文件、图片文件等。通常都把它们打包放在war文件中,这将增加了WAR文件的大小并且导致很多重复的加载静态资源。一个比较好的解决方法是使用Apache HTTP服务器去管理这些静态文件资源。也有一种做法是使用Linux上面的mount功能,配置share目录来实现,当然静态资源还是用Apache服务器更有效率。

Tomcat允许使用新的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 >

    假设/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 =

  4. (ByteArrayInputStream)getServletContext().getResourceAsStream("/static/bg.png");

  5. 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的复杂性增强可读性。

  6. • 异步处理web的请求,能让使用异步I/O的web应用程序可以移植到不同的web容器中。

  7. 异步处理使用非阻塞I/O,每次的HTTP连接都不需要对应一个线程。更少的线程可以为更多的连接提供服务。(这个应该是未来WEB容器的发展必备能力吧)

  8. 这对于需要长时间计算处理才能返回结果的情景来说是很有用的,比如产生报表,Web Servce调用等。

    • 安全的增强---Servlet 3.0现在使用SSL去加强了会话session的跟踪,代替了原来的cookie和URL重写。(使用SSL对用户体验有什么影响么?比如要求HTTPS?)

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

象在CATALINA_HOME/conf/server.xml中的很多配置,现在都可以用程序动态去设置了。

下面是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 >

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

  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/ 

7 异步日志记录:

包括了一个异步日志记录器(AsyncFileHandler)。使用AsyncFileHandler,时,只需要在CATALINA_HOME/conf/logging.properties中把FileHandler全部替换为AsyncFileHandler就可以了。当有日志发向AsyncFileHandler时,日志被加入到队列中(java.util.concurrent.LinkedBlockingDeque)并且方法调用的信息会马上返回不需要等待I/O写到磁盘中。当类加载器加载AsyncFileHandler时,会有一个单独的线程启动,这个线程会从队列中读取日志信息并且写到磁盘中去。

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/

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

译文链接:http://jackyrong.javaeye.com/blog/774685 根据译文有修改。

使用MediaPlayer出现The surface has been released 异常处理方法,附代码

用MediaPlayer播放视频或者音频的时候总出现这个错误,
  • colourfulcloud
  • colourfulcloud
  • 2014年08月01日 12:07
  • 3431

安卓:解决应用前后台切换报The surface has been released错误;PhoneStateListener实现通话状态的监听

安卓:解决应用前后台切换报The surface has been released错误;PhoneStateListener实现通话状态的监听。...
  • u012758599
  • u012758599
  • 2016年11月24日 13:28
  • 775

The surface has been released 异常

http://dingran.iteye.com/blog/1442502 ===================================== 在使用surfaceView和M...
  • dadoneo
  • dadoneo
  • 2012年07月05日 20:16
  • 22763

Assigning retained object to weak property object will be released after assignment

http://www.cnblogs.com/sunshine-anycall/p/3436659.html Assigning retained object to weak ...
  • baohanqing
  • baohanqing
  • 2016年03月09日 23:07
  • 1631

Android之播放器的恢复

在Android中 一个简单的播放器只需要MediaPlayer和SurfaceView就能完成,当然,若需要更多的功能,比如快进、快退都是可以的,只是暂时讨论的是最简单的。播放器有好多种状态,正如下...
  • qq_25034451
  • qq_25034451
  • 2016年09月29日 09:35
  • 330

JVM菜鸟进阶高手之路七(tomcat调优以及tomcat7、8性能对比)

因为每个链路都会对其性能造成影响,应该是全链路的修改压测(ak大神经常说全连路)。本次基本就是局域网,所以并没有怎么优化,其实也应该考虑进去的。 Linux系统参数层面的修改: 1、修改可打开文件数...
  • lirenzuo
  • lirenzuo
  • 2017年08月14日 17:33
  • 6005

centos 7 启用系统预装tomcat

centos安装时预装了tomcat,但是默认不启用。 用systemctl is-enabled tomcat 进行检查,返回disabled。 首先启用并启动tomcat 执行: ...
  • whatnamecaniuse
  • whatnamecaniuse
  • 2017年03月09日 15:14
  • 198

CentOS-7 安装 Tomcat8.X

安装说明安装环境:CentOS7 安装方式:源码安装 软件:apache-tomcat-8.0.30.tar.gz 下载地址:http://tomcat.apache.org/download...
  • shenlei19911210
  • shenlei19911210
  • 2015年12月28日 20:07
  • 2012

深入理解Tomcat 6和Tomcat7的区别

今天开始学习Tomcat7 ,竟然碰到了好多问题。到现在才刚刚解决的差不多。在此介绍一下。 Tomcat6下边程序运行极其正常换了 Tomcat7 忽然不能用的都来看看了~ 第一个: 是关于数据库驱动...
  • u013410747
  • u013410747
  • 2016年01月10日 08:02
  • 2164

层层深入讲解VC程序中Debug版本和Released版本区别

从事C++的,肯定都会遇到Debug版本和Release版本运行结果不一致的问题,肯定也会遇到两个版本中,其中某一个版本可以运行,而另一个版本导致程序崩溃的问题。     对于初学者而言,这无比是个...
  • llhhyy1989
  • llhhyy1989
  • 2012年10月29日 20:51
  • 3406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tomcat 7 released!
举报原因:
原因补充:

(最多只允许输入30个字)