Servlet四種過濾器的工做方式

從J2EE1.3開始,Servlet2.3規範中加入了對過濾器的支持。過濾器可以對目標資源的請求和響應進行截取。過濾器的工做方式分爲四種,下面讓咱們分別來看看這四種過濾器的工做方式: 
  一、request過濾器 
  這種過濾器的工做方式比較簡單,你們也常常遇到,以下所示:如下是web.xml文件配置方式: 
     <filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>packagename.MyFilterName</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>myFilter</filter> 
    <servlet-name> 目標資源</servlet-name> 
    </filter-mapping> 
    <filter> 

  下面咱們更改一下web.xml文件的配置,以下方式: 
     <filter-name>myFilter</filter-name> 
    <filter-class>packagename.MyFilterName</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>myFilter</filter> 
    <servlet-name> 目標資源1</servlet-name> 
    </filter-mapping> 
    <filter-mapping> 
    <filter-name>myFilter</filter> 
    <servlet-name> 目標資源2</servlet-name> 
    </filter-mapping> 


  也就是說此過濾器對目標資源一和目標資源二都進行過濾,而後當目標資源一被訪問的時候咱們將請求轉發給目標資源二,那麼這個時候過濾器是怎麼工做的呢?以下圖所示:咱們能夠看到,當咱們訪問目標資源一時過濾器截取了請求,而後再轉發給目標資源一,而後再轉發給目標資源二,從圖中咱們能夠看到過濾器沒有截取轉發到目標資源二的請求,可是咱們已經在web.xml文件中配置了該過濾器對目標資源二的過濾,爲何又沒有起到過濾做用呢? 
  答案就在於,目標資源一是客戶端直接訪問,而目標資源二是被轉發過來的,這時過濾器就不能過濾目標資源二。若是你直接訪問目標資源二,你會發現該過濾器起到了做用? 
   咱們上面的web.xml文件配置與如下方式等價: 
     <filter-name>myFilter</filter-name> 
    <filter-class>packagename.MyFilterName</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>myFilter</filter> 
    <servlet-name> 目標資源1</servlet-name> 
    <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 
    <filter-mapping> 
    <filter-name>myFilter</filter> 
    <servlet-name> 目標資源2</servlet-name> 
    <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 


  這種方式的配置,說明只有直接訪問該目標資源時該過濾器纔會起做用,對轉發到該目標資源的請求將忽略不處理。 
  那若是我想對轉發到目標資源二的請求進行過濾,那怎麼辦呢?答案見,下一種過濾器,forward過濾器。 
  二、forward過濾器 
  咱們將web.xml文件的配置修改以下: 
     
  <filter-name>myFilter</filter-name> 
   <filter-class>packagename.MyFilterName</filter-class> 
   </filter> 
   <filter-mapping> 
   <filter-name>myFilter</filter> 
   <servlet-name> 目標資源1</servlet-name> 
   <dispatcher>REQUEST</dispatcher> 
   </filter-mapping> 
   <filter-mapping> 
   <filter-name>myFilter</filter> 
   <servlet-name> 目標資源2</servlet-name> 
   <dispatcher>FORWARD</dispatcher> 
   </filter-mapping> 

  咱們看對目標資源二過濾的配置方式,這時過濾方式爲forward,也就是說對轉發到目標資源二的請求過濾,若是直接訪問目標資源二,過濾器將不起做用。 
    三、include過濾器 
  理解了forward過濾器以後,include過濾器就不難理解了。如下方式: 
    <filter-name>myFilter</filter-name> 
   <filter-class>packagename.MyFilterName</filter-class> 
   </filter> 
   <filter-mapping> 
   <filter-name>myFilter</filter> 
   <servlet-name> 目標資源1</servlet-name> 
   <dispatcher>REQUEST</dispatcher> 
   </filter-mapping> 
   <filter-mapping> 
   <filter-name>myFilter</filter> 
   <servlet-name> 目標資源2</servlet-name> 
   <dispatcher>INCLUDE</dispatcher> 
   </filter-mapping> 

  此表示對包含了目標資源二的請求過濾,若是直接訪問目標資源二,則此過濾器將不起做用。 
  在JSP頁面中的動做:指令包含,這時此過濾器不工做。 
  四、error過濾器 
  當咱們訪問一個web目標資源時,若是服務器沒有找到該目標資源,那麼服務器就會給出一個404錯誤代碼。若是咱們給404錯誤代碼定義一個頁面,那麼當404錯誤發生時就會調用該頁面,請看如下web.xml文件的配置: 

    <filter-name>myFilter</filter-name> 
   <filter-class>packagename.MyFilterName</filter-class> 
   </filter> 
   <filter-mapping> 
   <filter-name>myFilter</filter> 
   <servlet-name> /error.jsp</servlet-name> 
   <dispatcher>ERROR</dispatcher> 
   </filter-mapping> 
   <error-page> 
   <error-code>404</error-code> 
   <location>/error.jsp</location> 
   </error-page> 


  當咱們訪問一個不存在的文件時,就會訪問error.jsp,可是配置了過濾器對錯誤頁面進行過濾,因此過濾器先接受到請求,而後再轉發給error.jsp。 
  若是咱們訪問一個已經存在的頁面,會不會調用error.jsp呢?若是這個頁面中有response.sendError(404,"出錯了!");那麼該錯誤頁面仍然會被調用,過濾器也會工做。
web

相關文章
相關標籤/搜索