我的漫漫程序之旅

          專注于JavaWeb開(kāi)發(fā)
          隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0

          導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(39)

          隨筆檔案(43)

          文章分類(304)

          文章檔案(257)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          過(guò)濾器的工作方式

           從J2EE1.3開(kāi)始,Servlet2.3規(guī)范中加入了對(duì)過(guò)濾器的支持。過(guò)濾器能夠?qū)δ繕?biāo)資源的請(qǐng)求和響應(yīng)進(jìn)行截取。過(guò)濾器的工作方式分為四種,下面讓我們分別來(lái)看看這四種過(guò)濾器的工作方式:
          1、request過(guò)濾器
              這種過(guò)濾器的工作方式比較簡(jiǎn)單,大家也經(jīng)常遇到,如下圖所示:

          以下是web.xml文件配置方式:
          <filter>
              
          <filter-name>myFilter</filter-name>
              
          <filter-class>xx.MyFilter</filter-class>
          </filter>
          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <servlet-name>目標(biāo)資源一</servlet-name>
          </filter-mapping>

          下面我們更改一下web.xml文件的配置,如下方式:
          <filter>
              
          <filter-name>myFilter</filter-name>
              
          <filter-class>xx.MyFilter</filter-class>
          </filter>
          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <servlet-name>目標(biāo)資源一</servlet-name>
          </filter-mapping>
          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <servlet-name>目標(biāo)資源二</servlet-name>
          </filter-mapping>

          也就是說(shuō)此過(guò)濾器對(duì)目標(biāo)資源一和目標(biāo)資源二進(jìn)行過(guò)濾,然后當(dāng)目標(biāo)資源一被訪問(wèn)的時(shí)候我們將請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)資源二,那么這個(gè)時(shí)候過(guò)濾器是怎么工作的呢?如下圖所示:

              我們可以看到,當(dāng)我們?cè)L問(wèn)目標(biāo)資源一時(shí)過(guò)濾器截取了請(qǐng)求,然后再轉(zhuǎn)發(fā)給目標(biāo)資源一,然后再轉(zhuǎn)發(fā)給目標(biāo)資源二,從圖中我們可以看到過(guò)濾器沒(méi)有截取轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求,但是我們已經(jīng)在web.xml文件中配置了該過(guò)濾器對(duì)目標(biāo)資源二的過(guò)濾,為什么又沒(méi)有起到過(guò)濾作用呢?

              答案就在于,目標(biāo)資源一是客戶端直接訪問(wèn),而目標(biāo)資源二是被轉(zhuǎn)發(fā)過(guò)來(lái)的,這時(shí)過(guò)濾器就不能過(guò)濾目標(biāo)資源二。如果你直接訪問(wèn)目標(biāo)資源二,你會(huì)發(fā)現(xiàn)該過(guò)濾器起到了作用!
              我們上面的web.xml文件配置與以下方式等價(jià):

          <filter>myFilter</filter>
              
          <filter-name>myFilter</filter-name>
              
          <filter-class>xx.MyFilter</filte-class>
          </filter>
          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <servlet-name>目標(biāo)資源一</servlet-name>
            
          <dispatcher>REQUEST</dispatcher>
          </filter-mapping>
          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <servlet-name>目標(biāo)資源二</servlet-name>
            
          <dispatcher>REQUEST</dispatcher>
          </filter-mapping>

          這種方式的配置,說(shuō)明只有直接訪問(wèn)該目標(biāo)資源時(shí)該過(guò)濾器才會(huì)起作用,對(duì)轉(zhuǎn)發(fā)到該目標(biāo)資源的請(qǐng)求將忽略不處理
              那如果我想對(duì)轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求進(jìn)行過(guò)濾,那怎么辦呢?答案見(jiàn),下一種過(guò)濾器,forward過(guò)濾器


          2、forward過(guò)濾器
             
          我們將web.xml文件的配置修改如下:

          <filter>myFilter</filter>
              
          <filter-name>myFilter</filter-name>
              
          <filter-class>xx.MyFilter</filter-class>
          </filter>
          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <servlet-name>目標(biāo)資源一</servlet-name>
            
          <dispatcher>REQUEST</dispatcher>
          </filter-mapping>
          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <servlet-name>目標(biāo)資源二</servlet-name>
            
          <dispatcher>FORWARD</dispatcher>
          </filter-mapping>

          工作方式如下圖所示:
              我們看對(duì)目標(biāo)資源二過(guò)濾的配置方式,這時(shí)過(guò)濾方式為forward,也就是說(shuō)對(duì)轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求過(guò)濾,如果直接訪問(wèn)目標(biāo)資源二,過(guò)濾器將不起作用。

          3、include過(guò)濾器
              理解了forward過(guò)濾器之后,include過(guò)濾器就不難理解了。以下方式:

          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <servlet-name>目標(biāo)資源二</servlet-name>
            
          <dispatcher>INCLUDE</dispatcher>
          </filter-mapping>

           此表示對(duì)包含了目標(biāo)資源二的請(qǐng)求過(guò)濾,如果直接訪問(wèn)目標(biāo)資源二,則此過(guò)濾器將不起作用。
              include包含以下語(yǔ)句:
              在JSP頁(yè)面中的動(dòng)作:<jsp:include page=.......

              在Java代碼中的request.getRequestDispatcher("....").include
              注意:如果目標(biāo)資源一通過(guò)<%@ include file="目標(biāo)資源二"%>指令包含,這時(shí)此過(guò)濾器不工作

          4、error過(guò)濾器
             
          當(dāng)我們?cè)L問(wèn)一個(gè)web目標(biāo)資源時(shí),如果服務(wù)器沒(méi)有找到該目標(biāo)資源,那么服務(wù)器就會(huì)給出一個(gè)404錯(cuò)誤代碼。如果我們給404錯(cuò)誤代碼定義一個(gè)頁(yè)面,那么當(dāng)404錯(cuò)誤發(fā)生時(shí)就會(huì)調(diào)用該頁(yè)面,請(qǐng)看以下web.xml文件的配置:

          <filter-mapping>
            
          <filter-name>myFilter</filter-name>
            
          <url-pattern>/error.jsp</url-pattern>
            
          <dispatcher>ERROR</dispatcher>
          </filter-mapping>
          <error-page>
              
          <error-code>404</error-code>
              
          <location>/error.jsp</location>
          </error-page>

          當(dāng)我們?cè)L問(wèn)一個(gè)不存在的文件時(shí),就會(huì)訪問(wèn)error.jsp,但是配置了過(guò)濾器對(duì)錯(cuò)誤頁(yè)面進(jìn)行過(guò)濾,所以過(guò)濾器先接受到請(qǐng)求,然后再轉(zhuǎn)發(fā)給error.jsp。

              如果我們?cè)L問(wèn)一個(gè)已經(jīng)存在的頁(yè)面,會(huì)不會(huì)調(diào)用error.jsp呢?如果這個(gè)頁(yè)面中有response.sendError(404,"出錯(cuò)了!");那么該錯(cuò)誤頁(yè)面仍然會(huì)被調(diào)用,過(guò)濾器也會(huì)工作。




          posted on 2007-11-26 23:59 々上善若水々 閱讀(914) 評(píng)論(0)  編輯  收藏 所屬分類: JavaWeb

          主站蜘蛛池模板: 德阳市| 墨竹工卡县| 松潘县| 天门市| 萍乡市| 天全县| 星子县| 万宁市| 大化| 安达市| 盐山县| 汾阳市| 青冈县| 蕉岭县| 南郑县| 洛川县| 塔城市| 成都市| 东源县| 日照市| 商都县| 库尔勒市| 楚雄市| 北流市| 额尔古纳市| 姜堰市| 山西省| 临洮县| 安化县| 台北县| 三门峡市| 固安县| 施甸县| 娱乐| 宿松县| 新邵县| 班戈县| 广平县| 农安县| 南汇区| 安远县|