gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          filter過濾器


          從J2EE1.3開始,Servlet2.3規(guī)范中加入了對(duì)過濾器的支持。過濾器能夠?qū)δ繕?biāo)資源的請(qǐng)求和響應(yīng)進(jìn)行截取。
          Servlet2.4版本的servlet規(guī)范在部屬描述符中新增加了一個(gè)<dispatcher>元素,這個(gè)元素有四個(gè)可能的值:即REQUEST, FORWARD,INCLUDE和ERROR,可以在一個(gè)<filter-mapping>元素中加入任意數(shù)目的< dispatcher>,使得filter將會(huì)作用于直接從客戶端過來的request,通過forward過來的request,通過 include過來的request和通過<error-page>過來的request。如果沒有指定任何< dispatcher >元素,默認(rèn)值是REQUEST。
          過濾器的工作方式分為四種,下面讓我們分別來看看這四種過濾器的工作方式:
          1、request過濾器
              這種過濾器的工作方式比較簡單,大家也經(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>
          也就是說此過濾器對(duì)目標(biāo)資源一和目標(biāo)資源二都進(jìn)行過濾,然后當(dāng)目標(biāo)資源一被訪問的時(shí)候我們將請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)資源二,那么這個(gè)時(shí)候過濾器是怎么工作的呢?如下圖所示:


           我們可以看到,當(dāng)我們?cè)L問目標(biāo)資源一時(shí)過濾器截取了請(qǐng)求,然后再轉(zhuǎn)發(fā)給目標(biāo)資源一,然后再轉(zhuǎn)發(fā)給目標(biāo)資源二,從圖中我們可以看到過濾器沒有截取轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求,但是我們已經(jīng)在web.xml文件中配置了該過濾器對(duì)目標(biāo)資源二的過濾,為什么又沒有起到過濾作用呢?
              答案就在于,目標(biāo)資源一是客戶端直接訪問,而目標(biāo)資源二是被轉(zhuǎn)發(fā)過來的,這時(shí)過濾器就不能過濾目標(biāo)資源二。如果你直接訪問目標(biāo)資源二,你會(huì)發(fā)現(xiàn)該過濾器起到了作用?
              我們上面的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>
          這種方式的配置,說明只有直接訪問該目標(biāo)資源時(shí)該過濾器才會(huì)起作用,對(duì)轉(zhuǎn)發(fā)到該目標(biāo)資源的請(qǐng)求將忽略不處理。
              那如果我想對(duì)轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求進(jìn)行過濾,那怎么辦呢?答案見,下一種過濾器,forward過濾器。

          2、forward過濾器
              我們將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)資源二過濾的配置方式,這時(shí)過濾方式為forward,也就是說對(duì)轉(zhuǎn)發(fā)到目標(biāo)資源二的請(qǐng)求過濾,如果直接訪問目標(biāo)資源二,過濾器將不起作用。

          3、include過濾器
              理解了forward過濾器之后,include過濾器就不難理解了。以下方式:
          <filter-mapping>
            <filter-name>myFilter</filter-name>
            <servlet-name>目標(biāo)資源二</servlet-name>
            <dispatcher>INCLUDE</dispatcher>
          </filter-mapping>
              此表示對(duì)包含了目標(biāo)資源二的請(qǐng)求過濾,如果直接訪問目標(biāo)資源二,則此過濾器將不起作用。
              include包含以下語句:
              在JSP頁面中的動(dòng)作:<jsp:include page=.......
              在Java代碼中的request.getRequestDispatcher("....").include
              注意:如果目標(biāo)資源一通過<%@ include file="目標(biāo)資源二"%>指令包含,這時(shí)此過濾器不工作。后面給大家介紹指令包含和動(dòng)作包含的區(qū)別。

          4、error過濾器
              當(dāng)我們?cè)L問一個(gè)web目標(biāo)資源時(shí),如果服務(wù)器沒有找到該目標(biāo)資源,那么服務(wù)器就會(huì)給出一個(gè)404錯(cuò)誤代碼。如果我們給404錯(cuò)誤代碼定義一個(gè)頁面,那么當(dāng)404錯(cuò)誤發(fā)生時(shí)就會(huì)調(diào)用該頁面,請(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問一個(gè)不存在的文件時(shí),就會(huì)訪問error.jsp,但是配置了過濾器對(duì)錯(cuò)誤頁面進(jìn)行過濾,所以過濾器先接受到請(qǐng)求,然后再轉(zhuǎn)發(fā)給error.jsp。

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



          filter-mapping元素
          filter-mapping元素用來聲明Web應(yīng)用中的過濾器映射。過濾器可被映射到一個(gè)servlet或一個(gè)URL模式。將過濾器映射到一個(gè) servlet中會(huì)造成過濾器作用于servlet上。將過濾器映射到一個(gè)URL模式中則可以將過濾器應(yīng)用于任何資源,只要該資源的URL與URL模式匹 配。過濾是按照部署描述符的filter-mapping元素出現(xiàn)的順序執(zhí)行的。

          <!ELEMENT filter-mapping (filter-name, (url-pattern | servlet-name))>

          <!ELEMENT filter-name (#PCDATA)>

          <!ELEMENT url-pattern (#PCDATA)>

          <!ELEMENT servlet-name (#PCDATA)>

          filter-name值必須對(duì)應(yīng)filter元素中聲明的其中一個(gè)過濾器名稱。下面是一個(gè)含有filter-mapping元素的部署描述符:

          <?xml version="1.0" encoding="ISO-8859-1">
          <!DOCTYPE web-app
          PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "http://java.sun.com/dtd/web-app_2_3.dtd">
          <web-app>
          <filter>
          <filter-name>Encryption Filter</filter-name>
          <filter-class>com.brainysoftware.EncryptionFilter</filter-class>
          </filter>
          <filter-mapping>
          <filter-name>Encryption Filter</filter-name>
          <servlet-name>EncryptionFilteredServlet</servlet-name>
          </filter-mapping>
          </web-app>

          Example:

          ...
          6        <filter> 
          7
          <filter-name>helloWorld</filter-name>
          8
          <filter-class>com.acme.filter.HelloWorldFilter</filter-class>
          9
          </filter>
          10
          <filter>
          11
          <filter-name>message</filter-name>
          12
          <filter-class>com.acme.filter.MessageFilter</filter-class>
          13
          <init-param>
          14
          <param-name>message</param-name>
          15
          <param-value>A message to you!</param-value>
          16
          </init-param>
          17
          </filter>
          18
          <filter>
          19
          <filter-name>prePost</filter-name>
          20
          <filter-class>com.acme.filter.PrePostFilter</filter-class>
          21
          </filter>
          22
          <filter>
          23
          <filter-name>imageManipulator</filter-name>
          24
          <display-name>imageManipulator</display-name>
          25
          <filter-class>com.acme.filter.ImageFilter</filter-class>
          26
          <init-param>
          27
          <param-name>message</param-name>
          28
          <param-value>test</param-value>
          29
          </init-param>
          30
          </filter>
          31
          <filter>
          32
          <filter-name>gzip</filter-name>
          33
          <filter-class>com.acme.filter.GZIPFilter</filter-class>
          34
          </filter>
          35
          <filter-mapping>
          36
          <filter-name>helloWorld</filter-name>
          37
          <url-pattern>/filter.jsp</url-pattern>
          38
          </filter-mapping>
          39
          <filter-mapping>
          40
          <filter-name>message</filter-name>
          41
          <url-pattern>/filter2.jsp</url-pattern>
          42
          </filter-mapping>
          43
          <filter-mapping>
          44
          <filter-name>prePost</filter-name>
          45
          <url-pattern>/filter3.jsp</url-pattern>
          46
          </filter-mapping>
          47
          <filter-mapping>
          48
          <filter-name>imageManipulator</filter-name>
          49
          <url-pattern>/*.jpg</url-pattern>
          50
          </filter-mapping>
          51
          <filter-mapping>
          52
          <filter-name>gzip</filter-name>
          53
          <url-pattern>/*.jsp</url-pattern>
          54
          </filter-mapping>

          posted on 2008-05-27 00:42 gembin 閱讀(1990) 評(píng)論(1)  編輯  收藏 所屬分類: JavaEE

          評(píng)論

          # re: filter過濾器 2012-03-16 17:05 zhugl

          這樣配置后,jsp:include的url還是經(jīng)過filter.....
          而且只當(dāng)前jsp中include的經(jīng)過,被include的jsp中如果繼續(xù)include則不經(jīng)過....不知道為什么,崩潰了  回復(fù)  更多評(píng)論   

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊(cè)

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          free counters
          主站蜘蛛池模板: 慈溪市| 竹溪县| 瑞昌市| 南乐县| 贺州市| 大丰市| 岑巩县| 昔阳县| 大姚县| 竹北市| 南开区| 稷山县| 西盟| 正蓝旗| 嘉荫县| 揭西县| 江川县| 饶平县| 鹤峰县| 凤山县| 闸北区| 荣成市| 太仓市| 丹凤县| 青岛市| 依兰县| 固安县| 延川县| 五河县| 邢台县| 邛崃市| 双江| 卢氏县| 塘沽区| 寻乌县| 武隆县| 井陉县| 五原县| 宜黄县| 桃园市| 时尚|