廢話一概不說,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. 記憶體洩露的偵測和防止:
隻有有限的能力,包括部分如下情形:
以及部分 Java API 存在記憶體洩漏的場景:• JDBC驅動的注冊
• 一些日志架構
• 在ThreadLocals中儲存了對象但沒有删除它們
• 啟動了線程但沒停止
使用 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中配置的例子:
- < ?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");- 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的複雜性增強可讀性。 • 異步處理web的請求,能讓使用異步I/O的web應用程式可以移植到不同的web容器中。 異步處理使用非阻塞I/O,每次的HTTP連接配接都不需要對應一個線程。更少的線程可以為更多的連接配接提供服務。(這個應該是未來WEB容器的發展必備能力吧) 這對于需要長時間計算處理才能傳回結果的情景來說是很有用的,比如産生報表,Web Servce調用等。 • 安全的增強---Servlet 3.0現在使用SSL去加強了會話session的跟蹤,代替了原來的cookie和URL重寫。(使用SSL對使用者體驗有什麼影響麼?比如要求HTTPS?)
6 更容易将Tomcat内嵌到應用去中去,比如JBoss:
象在CATALINA_HOME/conf/server.xml中的很多配置,現在都可以用程式動态去設定了。
下面是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 異步日志記錄:
包括了一個異步日志記錄器(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 根據譯文有修改。