亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Tomcat 7 的七大新特性

系統(tǒng) 3177 0

Tomcat 7引入了許多新功能,并對現(xiàn)有功能進行了增強。很多文章列出了Tomcat 7的新功能,但大多數(shù)并沒有詳細解釋它們,或指出它們的不足,或提供代碼示例。本文將明確描述Tomcat 7中七個最顯著的特征和新增的功能,并對其作出評論,而不是僅僅列出新的功能。本文還提供了代碼例子以方便你可以對其有更好的理解。

本文分為兩個部分,分別是“Tomcat 7的新特性”和“Tomcat 7增強的功能”。

Tomcat 7新特性

1. 使用隨機數(shù)去防止跨站腳本攻擊;

2. 改變了安全認證中的jessionid的機制,防止session攻擊;

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

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

Tomcat 7的增強功能

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

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

7 異步日志記。

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

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

下面逐一開始介紹。

Tomcat 7新特性

1.?使用隨機數(shù)去防止跨站請求偽造攻擊。

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

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

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

這個servlet過濾器是十分簡單的,下面是從Tomcat 源代碼CsrfPreventionFilter文檔中摘錄的片段:

Java代碼:

  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);?????

所以每個URL地址中都有一個從用戶session中提取的隨機數(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? > ??

而現(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? > ??

具體的例子可以參考Tomcat 7自帶例子中的演示,這個過濾器可以在web.xml中進行配置,配置后,所有訪問如 http://localhost:8080/Tomcat7demo/csrf/ 的都必須帶上參數(shù),不帶上參數(shù)的話會出現(xiàn)403禁止訪問錯誤。

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

2.?改變了安全認證中的jessionid的機制,防止session攻擊。

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

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

2 受害者點這個帶有jsessionid的鏈接,提示輸入驗證信息之后就登陸系統(tǒng);

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

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

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

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

? Tomcat默認情況下安全性不再變得脆弱,因為驗證后會話發(fā)生了變化

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

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

? 能阻止session劫持攻擊,因為能讓Tomcat在驗證后改變session id。

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

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

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

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

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

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

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

? JDBC驅(qū)動的注冊

? 一些日志框架

? 在ThreadLocals中保存了對象但沒有刪除它們

? 啟動了線程但沒停止

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

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

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

3.使用 XML 解析器

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

5.從 Jar 文件中讀取資源

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

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

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

允許使用新的aliases屬性,指出靜態(tài)文件資源的位置,可以通過使用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? > ??

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

Tomcat 7的增強特性

5.?對Servlet 3.0,JSP 2.2和JSP-EL 2。2的支持

Servlet 3的增強特性有:

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

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

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

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

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

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

我們可以通過程序去進行動態(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/??

7.?異步日志記錄

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

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

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

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

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

Tomcat 7的自帶程序例子有兩個servlets,一個是演示了如何采用隨機數(shù)的辦法防止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

Tomcat 7 的七大新特性


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色就色综合| 久久伊人色综合 | 久久免费观看视频 | 日本免费三区 | 国产成人爱片免费观看视频 | 亚洲欧美国产18 | 99精品在线观看视频 | 毛片99| 亚洲国产欧美另类 | 久久久这里只有精品免费 | 国产精品久久久久蜜芽 | 四虎影视免费在线观看 | 欧美成人精品欧美一级乱黄 | 精品不卡一区中文字幕 | 亚洲高清中文字幕 | 免费女人18毛片a级毛片视频 | 久久久精品国产免费观看同学 | 99在线精品日韩一区免费国产 | 亚洲乱码中文字幕久久 | 久久久久久综合成人精品 | 日本一级成人毛片免费观看 | 2019年国产高清情侣视频 | 亚洲综合在线视频 | 国内精品视频一区二区三区八戒 | 逼毛片| 久热精品视频在线观看 | 国产精品一级 | 久久免费精品视频 | 色片在线免费观看 | 亚洲欧美日韩国产色另类 | 99久久99久久免费精品蜜桃 | 久久亚洲高清观看 | 草莓视频一区二区精品 | 国产小视频国产精品 | 一区二区3区免费视频 | 国产精品视频专区 | 国产男女xoxo在线视频 | 曰本一区二区三区 | 久久免费观看爱情动作片 | 日韩一级欧美一级毛片在 | 国产区精品福利在线观看精品 |