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

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

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

    無線&移動互聯網技術研發

    換位思考·····
    posts - 19, comments - 53, trackbacks - 0, articles - 283
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    對 WEB 過濾器的思考

    Posted on 2009-08-26 23:28 Gavin.lee 閱讀(384) 評論(0)  編輯  收藏 所屬分類: web 積累(前端 + 后臺)

    過濾器基本概念:

    過濾器能夠對目標資源的請求和響應進行截取,在過濾器中對用戶請求進行統一處理。

     過濾器是一個程序,它先于與之相關的servlet或JSP頁面運行在服務器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查

    進入這些資源的請求信息。過濾器是雙向的,容器接受到一個對資源的請求時,它將判斷是否有過濾器與這個資源相關聯。如果有,那么容器將

    把請求交給過濾器進行處理。在過濾器中,你可以改變請求的內容,或者重新設置請求的報頭信息,然后再將請求發送給目標資源。當目標資源

    對請求作出響應時候,容器同樣會將響應先轉發給過濾器,再過濾器中,你可以對響應的內容進行轉換,然后再將響應發送到客戶端


    過濾器的構造的全面解析:

    任何一個過濾器,都要實現Filter接口,重寫init,doFilter,destory方法。

    public void init(FilterConfig config) throws ServletException {}

    init會在容器初始化時被調用

    init方法只會在該Filter第一次被調用時初始化。對于簡單的過濾器,可提供此方法的一個空體,但有兩個原因需要使用init。首先,FilterConfig對象提

    供對servlet環境及web.xml文件中指派的過濾器名的訪問。因此,普遍的辦法是利用init將FilterConfig對象存放在一個字段中,以便doFilter方法能夠訪

    問servlet環境或過濾器名。其次,FilterConfig對象具有一個getInitParameter方法,它能夠訪問部署描述符文件(web.xml)中分配的過濾器初始化參

    數。

    FilterConfig接口:

    javax.servlet.FilterConfig接口類似于javax.servlet.ServletConfig接口,用于在過濾器初始化時,向其傳遞信息。ilterConfig

    接口有容器實現,容器將其作為參數傳入過濾器對象的init()方法中。在FilterConfig接口,定義了4個方法:

    ·public java.lang.String getFilterName()

    得到描述符中指定的過濾器的名字。
     

    ·public java.lang.String getInitParameter(java.lang.String name)

      返回在部署描述中指定的名字為name的初始化參數的值。如果不存在返回null.
     

    ·public java.util.Enumeration getInitParameterNames()

      返回過濾器的所有初始化參數的名字的枚舉集合。
     

    ·public ServletContext getServletContext()

      返回Servlet上下文對象的引用。


    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {}

    1.ServletRequest對象,此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的完全訪問,多數情況下,需要將

    ServletRequest對象構造成HttpServletRequest對象。

    2.ServletResponse對象,簡單過濾器則忽略該對象。

    3.FilterChain對象,在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被

    激活。

    對于doFilter方法,是每次請求與此過濾器相關的servlet或JSP頁面都會調用的方法。除了在兩個情形下要使用它以外,通常忽略這個參數。首先,如

    果希望完全阻塞對相關servlet或JSP頁面的訪問。可調用response.getWriter并直接發送一個響應到客戶機。其次,如果希望修改相關的servlet或JSP頁

    面的輸出,可把響應包含在一個收集所有發送到它的輸出的對象中。然后,在調用serlvet或JSP頁面后,過濾器可檢查輸出,如果合適就修改它,

    之后發送到客戶機。

    public void destroy() {}

    此方法在利用一個給定的過濾器對象永久地終止服務器(如關閉服務器)時調用。大多數過濾器簡單地為此方法提供一個空體,不過,可利用它

    來完成諸如關閉過濾器使用的文件或數據庫連接池等清除任務。

    說說FilterChain對象的doFilter方法,Filter接口的doFilter方法以一個FilterChain對象作為它的第三個參數。在調用該對象的doFilter方法時,激活下一個

    相關的過濾器。這個過程一般持續到鏈中最后一個過濾器為止。在最后一個過濾器調用其FilterChain對象的doFilter方法時,激活servlet或頁面自身。

    但是,鏈中的任意過濾器都可以通過不調用其FilterChain的doFilter方法中斷這個過程。在這樣的情況下,不再調用JSP頁面的serlvet,并且中斷此調

    用過程的過濾器負責將輸出提供給客戶機。

    web.xml中對Filter的標準配置

        <filter>
            
    <filter-name>EncodingUTF8</filter-name>
            
    <filter-class>yixun.wap.filter.SetCharacterEncodingFilter</filter-class>
            
    <init-param>
                
    <param-name>encoding</param-name>
                
    <param-value>UTF-8</param-value>
            
    </init-param>    
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>EncodingUTF8</filter-name>
            
    <url-pattern>*.jsp</url-pattern>    
            
    <dispatcher>REQUEST</dispatcher>    
        
    </filter-mapping>


    注:
    默認情況下,過濾器是按照配置文件中添加的順序應用于收到的數據。

    激活器servlet

    要傳遞參數的時候最好使用form進行傳參,如果使用鏈接的話當中文字符的時候過濾器轉碼是不會起作用的,還有就是頁面上form的method也要設

    置為post,不然過濾器也起不了作用。

    過濾器的工作方式:

    一:request過濾器
    請求直接從客戶端發過來
    通過在<dispatcher>元素中指定值REQUEST,或者不寫任何<dispatcher>元素的方式指定

    二:forward過濾器
    web組件使用forward()調用匹配<url-pattern><servlet-name>
    這通過在<dispatcher>元素中設定值FORWARD指定

    三:include過濾器
    web組件使用include()調用匹配<url-pattern><servlet-name>
    這通過在<dispatcher>元素中設置值INCLUDE指定

    四:error過濾器
    請求使用在“錯誤處理”中描述的錯誤機制進行處理,讓錯誤資源匹配<url-pattern>。這通過在<dispatcher>元素中設置值ERROR指定

        <filter>
            
    <filter-name>ErrorPage</filter-name>
            
    <filter-class>yixun.wap.filter.ErrorPageFilter</filter-class>
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>ErrorPage</filter-name>
            
    <url-pattern>/error.jsp</url-pattern>
            
    <dispatcher>ERROR</dispatcher>
        
    </filter-mapping>
        
    <error-page>
            
    <exception-type>NullPointerException</exception-type>
            
    <location>/error.jsp</location>
        
    </error-page>

        
    <error-page>
            
    <error-code>500</error-code>
            
    <location>/error.jsp</location>
        
    </error-page>

    對于上面配置,當出現空指針,或空指針時,就會跳轉到error.jsp頁面,在訪問error.jsp頁面前,由于對error.jsp進行了過濾,先執行ErrorPageFilter,然后轉向error.jsp

    如果我們實際訪問時,如果這個頁面中有response.sendError(500,"出錯了!"),或者手動拋出空指針時,;那么該錯誤頁面仍然會被調用,過濾器也會工作。

    過濾器的實踐:

    一:統一過濾HTTP請求(響應)頭(如:使瀏覽器不緩存頁面的過濾器  )

    二、權限控制(對不同角色在系統中跳轉進行檢查控制)

    三、字符編碼的過濾器 (對post數據起效)

    四、資源保護過濾器 (檢測用戶是否登陸的過濾器 )  

    五、阻塞請求


    參考文獻:http://www.vipcn.com/wangluobiancheng/JSP/servletheJSPguoluqiFilter.html 

    主站蜘蛛池模板: 日本免费人成黄页在线观看视频 | 亚洲色图在线观看| 一级毛片成人免费看a| 国产aa免费视频| 成人精品国产亚洲欧洲| 成年女人喷潮毛片免费播放| 亚洲视频国产视频| 免费视频爱爱太爽了| 亚洲人成电影院在线观看| 成年人网站免费视频| 亚洲国产日韩在线成人蜜芽| 99久久99久久精品免费看蜜桃| 亚洲性一级理论片在线观看| 亚洲三级高清免费| 亚洲色大情网站www| 国产美女无遮挡免费视频网站| 99亚洲乱人伦aⅴ精品| 亚洲精品国产成人影院| 三级网站在线免费观看| 亚洲视频免费在线观看| 亚洲一区在线免费观看| 亚洲熟妇少妇任你躁在线观看| 免费又黄又爽又猛的毛片| a色毛片免费视频| 亚洲视频国产视频| 情侣视频精品免费的国产| 一区二区三区视频免费| 久久亚洲精品成人| eeuss免费影院| 亚洲AV无码一区二区乱子伦| 久久久久久精品免费看SSS| 久久亚洲中文无码咪咪爱| 自拍偷自拍亚洲精品情侣| 亚洲高清视频免费| 国产精品亚洲一区二区三区| 亚洲国产另类久久久精品黑人| free哆啪啪免费永久| 免费国产黄网站在线看| 91精品国产亚洲爽啪在线观看| 夜夜爽免费888视频| 中文无码成人免费视频在线观看|