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

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

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

    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ī)范中加入了對過濾器的支持。過濾器能夠對目標資源的請求和響應進行截取。
    Servlet2.4版本的servlet規(guī)范在部屬描述符中新增加了一個<dispatcher>元素,這個元素有四個可能的值:即REQUEST, FORWARD,INCLUDE和ERROR,可以在一個<filter-mapping>元素中加入任意數目的< dispatcher>,使得filter將會作用于直接從客戶端過來的request,通過forward過來的request,通過 include過來的request和通過<error-page>過來的request。如果沒有指定任何< dispatcher >元素,默認值是REQUEST。
    過濾器的工作方式分為四種,下面讓我們分別來看看這四種過濾器的工作方式:
    1、request過濾器
        這種過濾器的工作方式比較簡單,大家也經常遇到,如下圖所示:

    以下是web.xml文件配置方式:
    <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>xx.MyFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>myFilter</filter-name>
      <servlet-name>目標資源一</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>目標資源一</servlet-name>
    </filter-mapping>
    <filter-mapping>
      <filter-name>myFilter</filter-name>
      <servlet-name>目標資源二</servlet-name>
    </filter-mapping>
    也就是說此過濾器對目標資源一和目標資源二都進行過濾,然后當目標資源一被訪問的時候我們將請求轉發(fā)給目標資源二,那么這個時候過濾器是怎么工作的呢?如下圖所示:


     我們可以看到,當我們訪問目標資源一時過濾器截取了請求,然后再轉發(fā)給目標資源一,然后再轉發(fā)給目標資源二,從圖中我們可以看到過濾器沒有截取轉發(fā)到目標資源二的請求,但是我們已經在web.xml文件中配置了該過濾器對目標資源二的過濾,為什么又沒有起到過濾作用呢?
        答案就在于,目標資源一是客戶端直接訪問,而目標資源二是被轉發(fā)過來的,這時過濾器就不能過濾目標資源二。如果你直接訪問目標資源二,你會發(fā)現(xiàn)該過濾器起到了作用?
        我們上面的web.xml文件配置與以下方式等價:
    <filter>myFilter</filter>
        <filter-name>myFilter</filter-name>
        <filter-class>xx.MyFilter</filte-class>
    </filter>
    <filter-mapping>
      <filter-name>myFilter</filter-name>
      <servlet-name>目標資源一</servlet-name>
      <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    <filter-mapping>
      <filter-name>myFilter</filter-name>
      <servlet-name>目標資源二</servlet-name>
      <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    這種方式的配置,說明只有直接訪問該目標資源時該過濾器才會起作用,對轉發(fā)到該目標資源的請求將忽略不處理。
        那如果我想對轉發(fā)到目標資源二的請求進行過濾,那怎么辦呢?答案見,下一種過濾器,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>目標資源一</servlet-name>
      <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    <filter-mapping>
      <filter-name>myFilter</filter-name>
      <servlet-name>目標資源二</servlet-name>
      <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    工作方式如下圖所示:


    我們看對目標資源二過濾的配置方式,這時過濾方式為forward,也就是說對轉發(fā)到目標資源二的請求過濾,如果直接訪問目標資源二,過濾器將不起作用。

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

    4、error過濾器
        當我們訪問一個web目標資源時,如果服務器沒有找到該目標資源,那么服務器就會給出一個404錯誤代碼。如果我們給404錯誤代碼定義一個頁面,那么當404錯誤發(fā)生時就會調用該頁面,請看以下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>
        當我們訪問一個不存在的文件時,就會訪問error.jsp,但是配置了過濾器對錯誤頁面進行過濾,所以過濾器先接受到請求,然后再轉發(fā)給error.jsp。

        如果我們訪問一個已經存在的頁面,會不會調用error.jsp呢?如果這個頁面中有response.sendError(404,"出錯了!");那么該錯誤頁面仍然會被調用,過濾器也會工作.



    filter-mapping元素
    filter-mapping元素用來聲明Web應用中的過濾器映射。過濾器可被映射到一個servlet或一個URL模式。將過濾器映射到一個 servlet中會造成過濾器作用于servlet上。將過濾器映射到一個URL模式中則可以將過濾器應用于任何資源,只要該資源的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值必須對應filter元素中聲明的其中一個過濾器名稱。下面是一個含有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 閱讀(1948) 評論(1)  編輯  收藏 所屬分類: JavaEE

    評論

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

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

    導航

    統(tǒng)計

    常用鏈接

    留言簿(6)

    隨筆分類(440)

    隨筆檔案(378)

    文章檔案(6)

    新聞檔案(1)

    相冊

    收藏夾(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

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    free counters
    主站蜘蛛池模板: 一级做a毛片免费视频| 一个人看的免费视频www在线高清动漫| 中文字幕的电影免费网站| 免费精品国产自产拍观看| 蜜桃传媒一区二区亚洲AV| 免费国产va在线观看| 亚洲AV无码乱码在线观看牲色| 麻豆亚洲AV成人无码久久精品 | 国产免费人成视频在线观看| 亚洲色欲色欱wwW在线| 日本无吗免费一二区| 一级毛片在播放免费| 国产亚洲精品岁国产微拍精品| 日韩精品无码免费专区午夜不卡| 亚洲福利视频一区| 1区2区3区产品乱码免费| 精品亚洲成A人无码成A在线观看| 成人一a毛片免费视频| 久久久久亚洲AV成人网| eeuss影院www天堂免费| 久久久亚洲欧洲日产国码农村| 在线观看免费中文视频| 亚洲va久久久久| www视频免费看| 亚洲色大成网站www尤物| 免费人成激情视频| 美国毛片亚洲社区在线观看| 亚洲乱码中文字幕综合234| 欧洲人成在线免费| 亚洲av无码国产精品夜色午夜| 免费在线观看亚洲| 亚洲色偷偷偷鲁综合| 三年片在线观看免费大全| 边摸边吃奶边做爽免费视频网站 | 亚洲情A成黄在线观看动漫软件 | 在线jlzzjlzz免费播放| h片在线播放免费高清| 亚洲福利电影在线观看| 一本色道久久88综合亚洲精品高清| 久久精品熟女亚洲av麻豆| 亚洲精品无码Av人在线观看国产 |