<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

    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文檔中摘錄的片段:

    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中提取的隨機數,下面是使用的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/

    posted on 2010-09-29 20:30 禮物 閱讀(563) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。

    網站導航:
     
    主站蜘蛛池模板: 一区二区三区免费精品视频| 亚洲午夜在线一区| 一个人看的hd免费视频| 四虎永久精品免费观看| 最新亚洲人成无码网站| gogo全球高清大胆亚洲| 一级毛片大全免费播放下载 | 亚洲一级片免费看| 啊v在线免费观看| 免费国产草莓视频在线观看黄| 国产一区二区三区在线观看免费 | 亚洲中字慕日产2020| 黄色网址免费观看| 久久精品国产亚洲αv忘忧草 | 亚洲高清无码综合性爱视频| 牛牛在线精品观看免费正| 国产精品亚洲高清一区二区| 国产午夜精品理论片免费观看| 亚洲AV无码一区二区二三区入口| 99精品视频在线观看免费播放| 亚洲视频一区在线观看| 国语成本人片免费av无码| 久久久久久亚洲av无码蜜芽| 无码不卡亚洲成?人片| 9久热精品免费观看视频| 亚洲国产成人久久综合一| 91久久精品国产免费直播| 亚洲欧洲国产综合AV无码久久| 国产a不卡片精品免费观看| 中文字幕av免费专区| 在线观看亚洲人成网站| 成人免费无遮挡无码黄漫视频| 美国免费高清一级毛片| 亚洲AV无码专区亚洲AV伊甸园| 在线观看无码AV网站永久免费| 亚洲av无码av在线播放| 亚洲欧洲日产国码无码久久99 | 日本免费福利视频| 两性色午夜视频免费网| 麻豆狠色伊人亚洲综合网站| 亚洲一区二区高清|