欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
用Java Servlets 2.4實(shí)現過(guò)濾 - good things in life ...

用Java Servlets 2.4實(shí)現過(guò)濾

Posted on 2006-10-24 10:03 daniel-shen 閱讀(10) 評論(0)  編輯 收藏 引用 網(wǎng)摘 所屬分類(lèi): java
【摘 要】雖然過(guò)濾器才出現幾年時(shí)間,但它們本身已作為一個(gè)關(guān)鍵組件嵌入到了所有敏捷的、面向對象的 J2EE Web 應用程序中。本文向您介紹了 Servlet 過(guò)濾器的使用。

Servlet API 很久以前就已成為企業(yè)應用開(kāi)發(fā)的基石,而 Servlet 過(guò)濾器則是對 J2EE 家族的相對較新的補充。本文將向您介紹 Servlet 過(guò)濾器體系結構,定義過(guò)濾器的許多應用,并指導您完成典型過(guò)濾器實(shí)現的三個(gè)步驟。同時(shí)本文還會(huì )透露bean 的一些激動(dòng)人心的變化,預計剛發(fā)布的 Java Servlet 2.4規范會(huì )引入這些變化。

  Servlet 過(guò)濾器是可插入的 Web 組件,它允許我們實(shí)現 Web 應用程序中的預處理和后期處理邏輯。過(guò)濾器支持 servlet 和 JSP 頁(yè)面的基本請求處理功能,比如日志記錄、性能、安全、會(huì )話(huà)處理、XSLT 轉換,等等。 過(guò)濾器最初是隨 Java Servlet 2.3 規范發(fā)布的,最近定稿的 2.4 規范對它進(jìn)行了重大升級。在此我將向您介紹 Servlet 過(guò)濾器的基礎知識 ―― 比如總體的體系結構設計、實(shí)現細節,以及在 J2EE Web 應用程序中的典型應用,還會(huì )涉及一些預計最新的 Servlet 規范將會(huì )提供的擴展功能。

  Servlet 過(guò)濾器是什么?

  Servlet 過(guò)濾器是小型的 Web 組件,它們攔截請求和響應,以便查看、提取或以某種方式操作正在客戶(hù)機和服務(wù)器之間交換的數據。過(guò)濾器是通常封裝了一些功能的 Web 組件,這些功能雖然很重要,但是對于處理客戶(hù)機請求或發(fā)送響應來(lái)說(shuō)不是決定性的。典型的例子包括記錄關(guān)于請求和響應的數據、處理安全協(xié)議、管理會(huì )話(huà)屬性,等等。過(guò)濾器提供一種面向對象的模塊化機制,用以將公共任務(wù)封裝到可插入的組件中,這些組件通過(guò)一個(gè)配置文件來(lái)聲明,并動(dòng)態(tài)地處理。

  Servlet 過(guò)濾器中結合了許多元素,從而使得過(guò)濾器成為獨特、強大和模塊化的 Web 組件。也就是說(shuō),Servlet 過(guò)濾器是:

* 聲明式的:過(guò)濾器通過(guò) Web 部署描述符(web.xml)中的 XML 標簽來(lái)聲明。這樣允許添加和刪除過(guò)濾器,而無(wú)需改動(dòng)任何應用程序代碼或 JSP 頁(yè)面。
* 動(dòng)態(tài)的:過(guò)濾器在運行時(shí)由 Servlet 容器調用來(lái)攔截和處理請求和響應。
* 靈活的:過(guò)濾器在 Web 處理環(huán)境中的應用很廣泛,涵蓋諸如日志記錄和安全等許多最公共的輔助任務(wù)。過(guò)濾器還是靈活的,因為它們可用于對來(lái)自客戶(hù)機的直接調用執行預處理和后期處理,以及處理在防火墻之后的 Web 組件之間調度的請求。最后,可以將過(guò)濾器鏈接起來(lái)以提供必需的功能。
* 模塊化的:通過(guò)把應用程序處理邏輯封裝到單個(gè)類(lèi)文件中,過(guò)濾器從而定義了可容易地從請求/響應鏈中添加或刪除的模塊化單元。
* 可移植的:與 Java 平臺的其他許多方面一樣,Servlet 過(guò)濾器是跨平臺和跨容器可移植的,從而進(jìn)一步支持了 Servler 過(guò)濾器的模塊化和可重用本質(zhì)。
* 可重用的:歸功于過(guò)濾器實(shí)現類(lèi)的模塊化設計,以及聲明式的過(guò)濾器配置方式,過(guò)濾器可以容易地跨越不同的項目和應用程序使用。
* 透明的:在請求/響應鏈中包括過(guò)濾器,這種設計是為了補充(而不是以任何方式替代)servlet 或 JSP 頁(yè)面提供的核心處理。因而,過(guò)濾器可以根據需要添加或刪除,而不會(huì )破壞 servlet 或 JSP 頁(yè)面。

  所以 Servlet 過(guò)濾器是通過(guò)一個(gè)配置文件來(lái)靈活聲明的模塊化可重用組件。過(guò)濾器動(dòng)態(tài)地處理傳入的請求和傳出的響應,并且無(wú)需修改應用程序代碼就可以透明地添加或刪除它們。最后,過(guò)濾器獨立于任何平臺或者 Servlet 容器,從而允許將它們容易地部署到任何相容的 J2EE 環(huán)境中。

  在接下來(lái)的幾小節中,我們將進(jìn)一步考察 Servlet 過(guò)濾器機制的總體設計,以及實(shí)現、配置和部署過(guò)濾器所涉及的步驟。我們還將探討 Servlet 過(guò)濾器的一些實(shí)際應用,最后簡(jiǎn)要考察一下模型-視圖-控制器(MVC)體系結構中包含的 Servlet 過(guò)濾器,從而結束本文的討論。

  Servlet 過(guò)濾器體系結構

  正如其名稱(chēng)所暗示的, Servlet 過(guò)濾器用于攔截傳入的請求和/或傳出的響應,并監視、修改或以某種方式處理正在通過(guò)的數據流。過(guò)濾器是自包含、模塊化的組件,可以將它們添加到請求/響應鏈中,或者在無(wú)需影響應用程序中其他 Web 組件的情況下刪除它們。過(guò)濾器僅只是改動(dòng)請求和響應的運行時(shí)處理,因而不應該將它們直接嵌入 Web 應用程序框架,除非是通過(guò) Servlet API 中良好定義的標準接口來(lái)實(shí)現。

  Web 資源可以配置為沒(méi)有過(guò)濾器與之關(guān)聯(lián)(這是默認情況)、與單個(gè)過(guò)濾器關(guān)聯(lián)(這是典型情況),甚至是與一個(gè)過(guò)濾器鏈相關(guān)聯(lián)。那么過(guò)濾器究竟做什么呢? 像 servlet 一樣,它接受請求并響應對象。然后過(guò)濾器會(huì )檢查請求對象,并決定將該請求轉發(fā)給鏈中的下一個(gè)組件,或者中止該請求并直接向客戶(hù)機發(fā)回一個(gè)響應。如果請求被轉發(fā)了,它將被傳遞給鏈中的下一個(gè)資源(另一個(gè)過(guò)濾器、servlet 或 JSP 頁(yè)面)。在這個(gè)請求設法通過(guò)過(guò)濾器鏈并被服務(wù)器處理之后,一個(gè)響應將以相反的順序通過(guò)該鏈發(fā)送回去。這樣就給每個(gè)過(guò)濾器都提供了根據需要處理響應對象的機會(huì )。

  當過(guò)濾器在 Servlet 2.3 規范中首次引入時(shí),它們只能過(guò)濾 Web 客戶(hù)機和客戶(hù)機所訪(fǎng)問(wèn)的指定 Web 資源之間的內容。如果該資源然后將請求調度給其他 Web 資源,那就不能向幕后委托的任何請求應用過(guò)濾器。2.4 規范消除了這個(gè)限制。Servlet 過(guò)濾器現在可以應用于 J2EE Web 環(huán)境中存在請求和響應對象的任何地方。因此,Servlet 過(guò)濾器可以應用在客戶(hù)機和 servlet 之間、servlet 和 servlet 或 JSP 頁(yè)面之間,以及所包括的每個(gè) JSP 頁(yè)面之間。這才是我所稱(chēng)的強大能力和靈活性!

  實(shí)現一個(gè) Servlet 過(guò)濾器

  他們說(shuō)“好事多磨& rdquo;。我不知道“他們”指的是誰(shuí),或者這句古老的諺語(yǔ)究竟有多真實(shí),但是實(shí)現一個(gè) Servlet 過(guò)濾器的確要經(jīng)歷三個(gè)步驟。首先要編寫(xiě)過(guò)濾器實(shí)現類(lèi)的程序,然后要把該過(guò)濾器添加到 Web 應用程序中(通過(guò)在 Web 部署描述符 /web.xml 中聲明它),最后要把過(guò)濾器與應用程序一起打包并部署它。我們將詳細研究這其中的每個(gè)步驟。

  1. 編寫(xiě)實(shí)現類(lèi)的程序

  過(guò)濾器 API 包含 3 個(gè)簡(jiǎn)單的接口(又是數字 3?。?,它們整潔地嵌套在 javax.servlet 包中。那 3 個(gè)接口分別是 Filter 、 FilterChain 和 FilterConfig 。從編程的角度看,過(guò)濾器類(lèi)將實(shí)現 Filter 接口,然后使用這個(gè)過(guò)濾器類(lèi)中的 FilterChain 和 FilterConfig 接口。該過(guò)濾器類(lèi)的一個(gè)引用將傳遞給 FilterChain 對象,以允許過(guò)濾器把控制權傳遞給鏈中的下一個(gè)資源。 FilterConfig 對象將由容器提供給過(guò)濾器,以允許訪(fǎng)問(wèn)該過(guò)濾器的初始化數據。

  為了與我們的三步模式保持一致,過(guò)濾器必須運用三個(gè)方法,以便完全實(shí)現 Filter 接口:

* init() :這個(gè)方法在容器實(shí)例化過(guò)濾器時(shí)被調用,它主要設計用于使過(guò)濾器為處理做準備。該方法接受一個(gè) FilterConfig 類(lèi)型的對象作為輸入。
* doFilter() :與 servlet 擁有一個(gè) service() 方法(這個(gè)方法又調用 doPost() 或者 doGet() )來(lái)處理請求一樣,過(guò)濾器擁有單個(gè)用于處理請求和響應的方法―― doFilter() 。這個(gè)方法接受三個(gè)輸入參數:一個(gè) ServletRequest 、 response 和一個(gè) FilterChain 對象。
* destroy() :正如您想像的那樣,這個(gè)方法執行任何清理操作,這些操作可能需要在自動(dòng)垃圾收集之前進(jìn)行。

清單 1 展示了一個(gè)非常簡(jiǎn)單的過(guò)濾器,它跟蹤滿(mǎn)足一個(gè)客戶(hù)機的 Web 請求所花的大致時(shí)間。

清單 1. 一個(gè)過(guò)濾器類(lèi)實(shí)現


import javax.servlet.*;
import java.util.*;
import java.io.*;
public class TimeTrackFilter implements Filter
{
   private FilterConfig filterConfig = null;
   public void init(FilterConfig filterConfig) throws ServletException 
   {
      this.filterConfig = filterConfig;
   }
   public void destroy() 
   {
      this.filterConfig = null;
   }
   public void doFilter( ServletRequest request,ServletResponse response, FilterChain chain ) throws IOException,ServletException 
   {
      Date startTime, endTime;
      double totalTime;
      startTime = new Date();
      // Forward the request to the next resource in the chain
      chain.doFilter(request, wrapper);
      // -- Process the response -- \\
      // Calculate the difference between the start time and end time
      endTime = new Date();
      totalTime = endTime.getTime() - startTime.getTime();
      totalTime = totalTime / 1000; //Convert from milliseconds to seconds
      StringWriter sw = new StringWriter();
      PrintWriter writer = new PrintWriter(sw);
      writer.println();
      writer.println("===============");
      writer.println("Total elapsed time is: " + totalTime + " seconds." );
      writer.println("===============");
      // Log the resulting string
      writer.flush();
      filterConfig.getServletContext().
      log(sw.getBuffer().toString());
   }
}

  這個(gè)過(guò)濾器的生命周期很簡(jiǎn)單,不管怎樣,我們還是研究一下它吧:

  初始化

  當容器第一次加載該過(guò)濾器時(shí), init() 方法將被調用。該類(lèi)在這個(gè)方法中包含了一個(gè)指向 FilterConfig 對象的引用。我們的過(guò)濾器實(shí)際上并不需要這樣做,因為其中沒(méi)有使用初始化信息,這里只是出于演示的目的。

  過(guò)濾

  過(guò)濾器的大多數時(shí)間都消耗在這里。 doFilter() 方法被容器調用,同時(shí)傳入分別指向這個(gè)請求/響應鏈中的 ServletRequest 、 ServletResponse 和 FilterChain 對象的引用。然后過(guò)濾器就有機會(huì )處理請求,將處理任務(wù)傳遞給鏈中的下一個(gè)資源(通過(guò)調用 FilterChain 對象引用上的 doFilter() 方法),之后在處理控制權返回該過(guò)濾器時(shí)處理響應。

  析構

  容器緊跟在垃圾收集之前調用 destroy() 方法,以便能夠執行任何必需的清理代碼。

  2. 配置 Servlet 過(guò)濾器

  過(guò)濾器通過(guò) web.xml 文件中的兩個(gè) XML 標簽來(lái)聲明。 <filter> 標簽定義過(guò)濾器的名稱(chēng),并且聲明實(shí)現類(lèi)和 init() 參數。 <filter-mapping> 標簽將過(guò)濾器與 servlet 或 URL 模式相關(guān)聯(lián)。

  清單 2 摘自一個(gè) web.xml 文件,它展示了如何聲明過(guò)濾器的包含關(guān)系:

清單 2. 在 web.xml 中聲明一個(gè)過(guò)濾器


<filter>
<filter-name>Page Request Timer</filter-name>
<filter-class>TimeTrackFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Page Request Timer</filter-name>
<servlet-name>Main Servlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>Main Servlet</servlet-name>
<servlet-class>MainServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Main Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

  上面的代碼示例聲明了一個(gè)過(guò)濾器("Page Request Timer"),并把它映射到一個(gè) servlet("Main Servlet")。然后為該 servlet 定義了一個(gè)映射,以便把每個(gè)請求(由通配符指定)都發(fā)送到該 servlet。這是控制器組件的典型映射聲明。您應該注意這些聲明的順序,因為千萬(wàn)不能背離這些元素的順序。

  3. 部署 Servlet 過(guò)濾器

  事實(shí)上,與 Web 應用程序一起部署過(guò)濾器絕對不涉及任何復雜性。只需把過(guò)濾器類(lèi)和其他 Web 組件類(lèi)包括在一起,并像您通常所做的那樣把 web.xml 文件(連同過(guò)濾器定義和過(guò)濾器映射聲明)放進(jìn) Web 應用程序結構中,servlet 容器將處理之后的其他所有事情。

  過(guò)濾器的許多應用

  您在 J2EE Web 應用程序中利用過(guò)濾器的能力,僅受到您自己的創(chuàng )造性和應用程序設計本領(lǐng)的限制。在適合使用裝飾過(guò)濾器模式或者攔截器模式的任何地方,您都可以使用過(guò)濾器。過(guò)濾器的一些最普遍的應用如下:
# 加載:對于到達系統的所有請求,過(guò)濾器收集諸如瀏覽器類(lèi)型、一天中的時(shí)間、轉發(fā) URL 等相關(guān)信息,并對它們進(jìn)行日志記錄。
# 性能:過(guò)濾器在內容通過(guò)線(xiàn)路傳來(lái)并在到達 servlet 和 JSP 頁(yè)面之前解壓縮該內容,然后再取得響應內容,并在將響應內容發(fā)送到客戶(hù)機機器之前將它轉換為壓縮格式。
# 安全:過(guò)濾器處理身份驗證令牌的管理,并適當地限制安全資源的訪(fǎng)問(wèn),提示用戶(hù)進(jìn)行身份驗證和/或將他們指引到第三方進(jìn)行身份驗證。過(guò)濾器甚至能夠管理訪(fǎng)問(wèn)控制列表(Access Control List,ACL),以便除了身份驗證之外還提供授權機制。將安全邏輯放在過(guò)濾器中,而不是放在 servlet 或者 JSP 頁(yè)面中,這樣提供了巨大的靈活性。在開(kāi)發(fā)期間,過(guò)濾器可以關(guān)閉(在 web.xml 文件中注釋掉)。在生產(chǎn)應用中,過(guò)濾器又可以再次啟用。此外還可以添加多個(gè)過(guò)濾器,以便根據需要提高安全、加密和不可拒絕的服務(wù)的等級。
# 會(huì )話(huà)處理:將 servlet 和 JSP 頁(yè)面與會(huì )話(huà)處理代碼混雜在一起可能會(huì )帶來(lái)相當大的麻煩。使用過(guò)濾器來(lái)管理會(huì )話(huà)可以讓 Web 頁(yè)面集中精力考慮內容顯示和委托處理,而不必擔心會(huì )話(huà)管理的細節。
# XSLT 轉換:不管是使用移動(dòng)客戶(hù)端還是使用基于 XML 的 Web 服務(wù),無(wú)需把邏輯嵌入應用程序就在 XML 語(yǔ)法之間執行轉換的能力都絕對是無(wú)價(jià)的。

  使過(guò)濾器適應 MVC 體系結構

  模型-視圖-控制器(Model-View- Controller,MVC)體系結構是一個(gè)有效的設計,它現在已作為最重要的設計方法學(xué),整合到了諸如 Jakarta Struts 和 Turbine 等大多數流行的 Web 應用框架中。過(guò)濾器旨在擴充 MVC 體系結構的請求/響應處理流。不管請求/響應發(fā)生在客戶(hù)機和服務(wù)器之間,還是發(fā)生在服務(wù)器上的其他組件之間,過(guò)濾器在處理流中的應用都是相同的。從 MVC 的觀(guān)點(diǎn)看,調度器組件(它或者包括在控制器組件中,或者配合控制器組件工作)把請求轉發(fā)給適當的應用程序組件以進(jìn)行處理。這使得控制器層成為包括 Servlet 過(guò)濾器的最佳位置。通過(guò)把過(guò)濾器放在控制器組件本身的前面,過(guò)濾器可以應用于所有請求,或者通過(guò)將它放在控制器/調度器與模型和控制器之間,它可以應用于單獨的 Web 組件。

  MVC 體系結構廣為傳播,并具有良好的文檔,詳細討論MVC不是本文的內容,有興趣的讀者可自行查找相關(guān)內容。

  結束語(yǔ)

  雖然過(guò)濾器才出現幾年時(shí)間,但它們本身已作為一個(gè)關(guān)鍵組件嵌入到了所有敏捷的、面向對象的 J2EE Web 應用程序中。本文向您介紹了 Servlet 過(guò)濾器的使用。本文討論了過(guò)濾器的高級設計,比較了當前規范(2.4)和以前(2.3)的模型,講述了實(shí)現過(guò)濾器所涉及的精確步驟,以及如何在 Web 應用程序中聲明過(guò)濾器,然后與應用程序一起部署它。本文還闡述了 Servlet 過(guò)濾器的一些最普遍應用,并提到了過(guò)濾器如何適應傳統的 MVC 體系結構。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
一個(gè)servlet登陸過(guò)濾器
過(guò)濾器解壓縮Servlet和JSP頁(yè)面內容
JSP/Servlet中Filter的應用
Servlet過(guò)濾器和監聽(tīng)器知識總結
Servlet過(guò)濾器
servlet filter初探
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久