自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解Tomcat 7的七大新特性和新增功能

開發(fā) 后端
本文將明確描述Tomcat 7中七個(gè)最顯著的特征和新增的功能,并對(duì)其作出評(píng)論,而不是僅僅列出新的功能。本文還提供了代碼例子以方便你可以對(duì)其有更好的理解。

Apache發(fā)布首個(gè)Tomcat 7版本已經(jīng)發(fā)布了有一段時(shí)間了,Tomcat 7引入了許多新功能,并對(duì)現(xiàn)有功能進(jìn)行了增強(qiáng)。很多文章列出了Tomcat 7的新功能,但大多數(shù)并沒有詳細(xì)解釋它們,或指出它們的不足,或提供代碼示例。本文將明確描述Tomcat 7中七個(gè)最顯著的特征和新增的功能,并對(duì)其作出評(píng)論,而不是僅僅列出新的功能。本文還提供了代碼例子以方便你可以對(duì)其有更好的理解。

本文分為兩個(gè)部分,分別是”Tomcat 7的新特性”和“Tomcat 7增強(qiáng)的功能”。

Tomcat 7新特性

1 使用隨機(jī)數(shù)去防止跨站腳本攻擊。

2 改變了安全認(rèn)證中的jessionid的機(jī)制,防止session攻擊。

3 內(nèi)存泄露的偵測(cè)和防止

4 在war文件外使用別名去存儲(chǔ)靜態(tài)內(nèi)容。

Tomcat 7的增強(qiáng)功能

5 對(duì)Servlet 3.0,JSP 2.2和JSP-EL 2。2的支持

6 更容易將Tomcat內(nèi)嵌到應(yīng)用去中去,比如JBoss

7 異步日志記錄

根據(jù)Mark Thomas,Tomcat 7委員會(huì)的經(jīng)理的說法,Tomcat 7最顯著的三個(gè)特征是Servlet 3.0,內(nèi)存檢測(cè)泄露和增強(qiáng)的安全特性。

Tomcat 7的例子程序中,包含了Eclipse的工程文件和Ant的構(gòu)建文件,以方便去構(gòu)建war文件。其中Eclipse工程文件有例子代碼描述了Tomcat 7的一些新特性。

下面逐一開始介紹。

Tomcat 7新特性

一、使用隨機(jī)數(shù)去防止跨站請(qǐng)求偽造攻擊

Wikipedia將跨站請(qǐng)求偽造攻擊(Cross Site Request forgery,CSRF)定義為:“一種影響Web應(yīng)用的惡意攻擊。CSRF讓用戶當(dāng)進(jìn)入一個(gè)可信任的網(wǎng)頁時(shí),被強(qiáng)行執(zhí)行惡意代碼。

經(jīng)典的防止CSRF攻擊的方法是使用隨機(jī)數(shù)的方式,Wikipedia中定義為“利用隨機(jī)或偽隨機(jī)數(shù)嵌入到認(rèn)證協(xié)議中,以確保舊的不能在以后的重放攻擊中被利用。”

Tomcat 7中有一個(gè)servlet過濾器,用于將隨機(jī)數(shù)存儲(chǔ)在用戶每次請(qǐng)求處理后的seesion會(huì)話中。這個(gè)隨機(jī)數(shù),必須作為每次請(qǐng)求中的一個(gè)參數(shù)。 Servlet過濾器然后檢查在請(qǐng)求中的這個(gè)隨機(jī)數(shù)是否與存儲(chǔ)在用戶session中的隨機(jī)數(shù)是一樣的。如果它們是相同的,該請(qǐng)求是判斷來自指定的網(wǎng)站。如果它們是不同的,該請(qǐng)求被認(rèn)為是從其他網(wǎng)站發(fā)出并且會(huì)被拒絕。

這個(gè)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.  

所以每個(gè)URL地址中都有一個(gè)從用戶session中提取的隨機(jī)數(shù),下面是使用的JSTL例子:

在以前,JSTL中構(gòu)造鏈接可以這樣:

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

而現(xiàn)在可以這樣:

  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自帶例子中的演示,這個(gè)過濾器可以在web.xml中進(jìn)行配置,配置后,所有訪問如:http://localhost:8080/tomcat7demo/csrf/的都必須帶上參數(shù),不帶上參數(shù)的話會(huì)出現(xiàn)403禁止訪問錯(cuò)誤。

當(dāng)然這種方法的缺點(diǎn)就是所有的鏈接都必須帶上這個(gè)隨機(jī)數(shù)。

二、改變了安全認(rèn)證中的jessionid的機(jī)制,防止session攻擊

Session劫持攻擊通常是以下的情況:

1 惡意攻擊者先訪問一個(gè)網(wǎng)頁,由于cookie是以jsession id的方式存儲(chǔ)在瀏覽器中的,即使攻擊者不登陸,他可以偽造一個(gè)帶有jsession id的地址,把它發(fā)給受害者,比如:http://example.com/login?JESSIONID=qwerty

2 受害者點(diǎn)這個(gè)帶有jsessionid的鏈接,提示輸入驗(yàn)證信息之后就登陸系統(tǒng)。

3 攻擊者現(xiàn)在使用這個(gè)帶jsessionid的鏈接,以受害者的身份登陸進(jìn)系統(tǒng)了。

對(duì)于攻擊者來說,將jsessionid加在url中以及通過一個(gè)惡意表單發(fā)送出去是很容易的事,對(duì)于session劫持攻擊的更詳細(xì)描述,請(qǐng)參考Acros Security組織的白皮書“Session Fixation Vulnerability in Web-based Applications”。

Tomcat 7對(duì)此的解決方案是一個(gè)補(bǔ)丁,它在驗(yàn)證后改變了jsessionid。這個(gè)補(bǔ)丁主要是應(yīng)用在Tomcat 7中,當(dāng)然在TOMCAT 5和6中也可以使用但只是有些不同。

根據(jù)Mark Thomas說的,應(yīng)用了Tomcat 7的這個(gè)補(bǔ)丁后:

◆ TOMCAT默認(rèn)情況下安全性不再變得脆弱,因?yàn)轵?yàn)證后會(huì)話發(fā)生了變化

◆ 如果用戶改變了默認(rèn)設(shè)置(比如應(yīng)用程序不能處理變化了的session id),風(fēng)險(xiǎn)也會(huì)降到最小,因?yàn)樵赟ervlet 3中,可以禁止在url中進(jìn)行會(huì)話跟蹤。

而在TOMCAT 5和TOMCAT 6中,應(yīng)用了補(bǔ)丁后:

◆ 能阻止session劫持攻擊,因?yàn)槟茏孴OMCAT在驗(yàn)證后改變session id。

◆ 如果應(yīng)用程序不能處理變化了的session id,可以通過寫自定義的過濾器去檢查request.isRequestedSessionIdFromURL()和其返回的結(jié)果,以降低風(fēng)險(xiǎn)。

以上這些改變都是TOMCAT在幕后所做的,開發(fā)者根本不用去理會(huì)。

三、內(nèi)存泄露的偵測(cè)和防止

開發(fā)者在部署他們寫的程序到生產(chǎn)環(huán)境上時(shí),經(jīng)常會(huì)遇到Pemgen錯(cuò)誤:OutOfMemoryError。這是由于內(nèi)存泄露而引起的。通常開發(fā)者是通過增大permgen內(nèi)存的大小去解決或者就是重新啟動(dòng)tomcat。

Tomcat 7包含了一個(gè)新的特性,它通過把不能垃圾回收的引用對(duì)象移走的方法,能解決一些Permgen內(nèi)存泄露的問題。這個(gè)特性對(duì)程序員部署應(yīng)用程序在他們的開發(fā)環(huán)境中是十分方便的,因?yàn)槌绦騿T在開發(fā)環(huán)境中為了節(jié)省時(shí)間一般不重新啟動(dòng)Tomcat就能部署新的war文件。在生產(chǎn)環(huán)境中,最好的建議還是停掉TOMCAT,然后清除work下面的目錄文件并且重新部署應(yīng)用。

當(dāng)然,內(nèi)存泄露檢測(cè)和防止這個(gè)特性現(xiàn)在還不是很完善,還是有的情況TOMCAT不能檢測(cè)內(nèi)存泄露和修復(fù)之的,所以對(duì)于生產(chǎn)環(huán)境,最好的的辦法還是停掉TOMCAT,然后清除work下面的目錄文件并且重新部署應(yīng)用。

Mark Thomas解析應(yīng)用程序或者庫程序在如下情況下會(huì)觸發(fā)內(nèi)存泄露:

◆ JDBC驅(qū)動(dòng)的注冊(cè)

◆ 一些日志框架

◆ 在ThreadLocals中保存了對(duì)象但沒有刪除它們

◆ 啟動(dòng)了線程但沒停止

而 Java API 存在內(nèi)存泄漏的地方包括:

1.使用 javax.imageio API ( Google Web Toolkit會(huì)用到)

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

3.使用 XML 解析器

4.使用 RMI 遠(yuǎn)程方法調(diào)用

5.從 Jar 文件中讀取資源

四、在war文件外使用別名去存儲(chǔ)靜態(tài)內(nèi)容

Web應(yīng)用程序需要靜態(tài)資源文件,比如象CSS,Javascript和視頻文件、圖片文件等。通常都把它們打包放在war文件中,這將增加了WAR文件的大小并且導(dǎo)致很多重復(fù)的加載靜態(tài)資源。一個(gè)比較好的解決方法是使用Apache HTTP服務(wù)器去管理這些靜態(tài)文件資源,下面是一個(gè)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.  

以上的設(shè)置,使得訪問http://localhost/static時(shí),能訪問到放在/home/avneet/temp/static下的資源。

允許使用新的aliases屬性,指出靜態(tài)文件資源的位置,可以通過使用Classloader.getResourceAsStream('/static/...')或者在鏈接中嵌入的方法讓TOMCAT去解析絕對(duì)路徑,下面是一個(gè)在context.xml中配置的例子:

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

假設(shè)/home/avneet/temp/static這個(gè)文件夾存放有一張圖片bg.png,如果war文件以tomcat7demo的名字部署,那么可以通過以下三個(gè)方式去訪問這張圖片

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的設(shè)置,并且可以在servlet容器范圍內(nèi)訪問,并且不需要Apache。

[[15941]]

#p#

Tomcat 7的增強(qiáng)特性

五、對(duì)Servlet 3.0,JSP 2.2和JSP-EL 2.2的支持

Servlet 3的增強(qiáng)特性有:

◆ 可以在POJO或者過濾器filters中使用annotations注釋(在web.xml中不再需要再進(jìn)行設(shè)置了)

◆ 可以將web.xml分塊進(jìn)行管理了。也就是說,用戶可以編寫多個(gè)xml文件,而最終在web.xml中組裝它們,這將大大降低web.xml的復(fù)雜性增強(qiáng)可讀性。比如, struts.jar和spring-mvc.jar每一個(gè)都可以有一個(gè)web-fragment.xml。開發(fā)者不再需要在web.xml中去配置它們了,在web-fragment.xml中的jar文件會(huì)自動(dòng)加載,并且struts/spring-mvc servlets和filters也會(huì)自動(dòng)裝配設(shè)置。

◆ 異步處理web的請(qǐng)求----這個(gè)特性在tomcat 6 中已經(jīng)有了,現(xiàn)在在Tomcat 7中以Servlet 3標(biāo)準(zhǔn)規(guī)范化了,能讓使用異步I/O的web應(yīng)用程序可以移植到不同的web容器中。異步處理使用非阻塞I/O,每次的HTTP連接都不需要對(duì)應(yīng)一個(gè)線程。更少的線程可以為更多的連接提供服務(wù)。這對(duì)于需要長時(shí)間計(jì)算處理才能返回結(jié)果的情景來說是很有用的,比如產(chǎn)生報(bào)表,Web Servce調(diào)用等。

◆ 安全的增強(qiáng)---Servlet 3.0現(xiàn)在使用SSL 去加強(qiáng)了會(huì)話session的跟蹤,代替了原來的cookie和URL重寫。

六、更容易將Tomcat內(nèi)嵌到應(yīng)用去中去

Tomcat 7現(xiàn)在可以嵌入到應(yīng)用程序中去,并可以通過程序去動(dòng)態(tài)設(shè)置和啟動(dòng)。象在CATALINA_HOME/conf/server.xml中的很多配置,現(xiàn)在都可以用程序動(dòng)態(tài)去設(shè)置了。在Tomcat 7前,Tomcat 6提供了一個(gè)嵌入類,它能方便地去配置Tomcat。但在Tomcat 7中,這個(gè)類已被廢棄了。這個(gè)新的Tomcat 7的類,使用了幾個(gè)默認(rèn)的配置元素,并提供了一個(gè)更容易和簡單的方法去嵌入Tomcat。

下面是CATALINA_HOME/conf/server.xml中的一些相關(guān)屬性和配置:

  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.  

我們可以通過程序去進(jìn)行動(dòng)態(tài)設(shè)置了:

  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現(xiàn)在包括了一個(gè)異步日志記錄器(AsyncFileHandler)。AsyncFileHandler繼承了FileHandler類并能代替FileHandler。使用AsyncFileHandler,時(shí),只需要在CATALINA_HOME/conf/logging.properties中把FileHandler全部替換為AsyncFileHandler就可以了。要注意的是異步日志不能跟log4一起工作。

當(dāng)有日志發(fā)向AsyncFileHandler時(shí),日志被加入到隊(duì)列中(java.util.concurrent.LinkedBlockingDeque)并且方法調(diào)用的信息會(huì)馬上返回不需要等待I/O寫到磁盤中。當(dāng)類加載器加載AsyncFileHandler時(shí),會(huì)有一個(gè)單獨(dú)的線程啟動(dòng),這個(gè)線程會(huì)從隊(duì)列中讀取日志信息并且寫到磁盤中去

這種方法的好處是如果I/O速度很慢(比如日志要保存在遠(yuǎn)端的設(shè)備上)時(shí),記錄日志的請(qǐng)求和處理過程不會(huì)顯得很慢。

AsyncFileHandler使用生產(chǎn)者和消費(fèi)者的關(guān)系原理,在隊(duì)列中存儲(chǔ)日志信息。隊(duì)列默認(rèn)大小為10000。為了預(yù)防隊(duì)列溢出,默認(rèn)是丟棄最后的信息。默認(rèn)的隊(duì)列大小和溢出的設(shè)置都可以通過啟動(dòng)參數(shù)進(jìn)行設(shè)置。

關(guān)于Tomcat 7的示例程序

Tomcat 7的自帶程序例子有兩個(gè)servlets,一個(gè)是演示了如何采用隨機(jī)數(shù)的辦法防止CSRF攻擊,另外一個(gè)是描述了使用aliases。更新一下web/META-INF/context.xml,指出圖片的絕對(duì)路徑即可順利運(yùn)行。

通過ant運(yùn)行build.xml去將它們部署到Tomcat 7中,使用如下兩個(gè)地址訪問:

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

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

[[15941]] 

【編輯推薦】

  1. Apache發(fā)布首個(gè)Tomcat 7版本 多項(xiàng)重要改進(jìn)
  2. 多圖詳解教程:Eclipse 3.6連接Tomcat 7
  3. Tomcat 7偷跑? 正式版目錄已存在
  4. 專家訪談:Tomcat 7的內(nèi)存泄漏保護(hù)
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2020-02-06 09:00:00

ESES2020前端

2009-11-26 10:52:01

Java 7

2010-08-03 13:30:39

AdobeFlexBu

2011-08-10 10:41:19

虛擬化VMware ESXi

2015-10-26 09:04:21

PHP7新特性

2018-09-30 14:20:03

編程語言Java新特性

2015-08-07 09:07:45

Java新特性面向未來

2010-03-26 14:37:57

Visual Stud

2019-12-26 09:00:27

云計(jì)算悖論智能

2011-04-02 09:45:00

Ubuntu 11.0特性

2009-07-07 12:30:38

JDK1.6

2011-01-13 13:48:52

Android 3.0

2017-02-21 09:02:34

Linux功能系統(tǒng)

2013-09-26 15:55:45

iOS7功能

2009-07-03 17:40:35

JSP2.0

2015-08-11 16:09:40

移動(dòng)·開發(fā)技術(shù)周刊

2009-07-16 10:35:34

iBATIS特性

2012-12-25 10:05:27

2012-12-26 09:14:40

Windows Ser微軟

2011-09-08 09:33:08

Ubuntu 11.1
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)