日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

(转)过滤器原理

發布時間:2023/12/24 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 (转)过滤器原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/csh624366188/article/details/7423215

1、Filter工作原理(執行流程)

當客戶端發出Web資源的請求時,Web服務器根據應用程序配置文件設置的過濾規則進行檢查,若客戶請求滿足過濾規則,則對客戶請求/響應進行攔截,對請求頭和請求數據進行檢查或改動,并依次通過過濾器鏈,最后把請求/響應交給請求的Web資源處理。請求信息在過濾器鏈中可以被修改,也可以根據條件讓請求不發往資源處理器,并直接向客戶機發回一個響應。當資源處理器完成了對資源的處理后,響應信息將逐級逆向返回。同樣在這個過程中,用戶可以修改響應信息,從而完成一定的任務。

上面說了,當一個請求符合某個過濾器的過濾條件時該請求就會交給這個過濾器去處理。那么當兩個過濾器同時過濾一個請求時誰先誰后呢?這就涉及到了過濾鏈FilterChain。

所有的奧秘都在Filter的FilterChain中。服務器會按照web.xml中過濾器定義的先后循序組裝成一條鏈,然后一次執行其中的doFilter()方法。執行的順序就如下圖所示,執行第一個過濾器的chain.doFilter()之前的代碼,第二個過濾器的chain.doFilter()之前的代碼,請求的資源,第二個過濾器的chain.doFilter()之后的代碼,第一個過濾器的chain.doFilter()之后的代碼,最后返回響應。


這里還有一點想補充:大家有沒有想過,上面說的“執行請求的資源”究竟是怎么執行的?對于“執行第一個過濾器的chain.doFilter()之前的代碼,第二個過濾器的chain.doFilter()之前的代碼”這些我可以理解,無非就是按順序執行一句句的代碼,但對于這個“執行請求的資源”我剛開始卻是怎么也想不明白。其實是這樣的:

通常我們所訪問的資源是一個servlet或jsp頁面,而jsp其實是一個被封裝了的servlet,于是我們就可以統一地認為我們每次訪問的都是一個Servlet,而每當我們訪問一個servlet時,web容器都會調用該Servlet的service方法去處理請求。而在service方法又會根據請求方式的不同(Get/Post)去調用相應的doGet()或doPost()方法,實際處理請求的就是這個doGet或doPost方法。寫過servlet的朋友都應該知道,我們在doGet(或doPost)方法中是通過response.getWriter()得到客戶端的輸出流對象,然后用此對象對客戶進行響應。

到這里我們就應該理解了過濾器的執行流程了:執行第一個過濾器的chain.doFilter()之前的代碼——>第二個過濾器的chain.doFilter()之前的代碼——>……——>第n個過濾器的chain.doFilter()之前的代碼——>所請求servlet的service()方法中的代碼——>所請求servlet的doGet()或doPost()方法中的代碼——>第n個過濾器的chain.doFilter()之后的代碼——>……——>第二個過濾器的chain.doFilter()之后的代碼——>第一個過濾器的chain.doFilter()之后的代碼。

過濾器生命周期的四個階段:

1、實例化:Web容器在部署Web應用程序時對所有過濾器進行實例化。Web容器回調它的無參構造方法。2、初始化:實例化完成之后,馬上進行初始化工作。Web容器回調init()方法。

3、過濾:請求路徑匹配過濾器的URL映射時。Web容器回調doFilter()方法——主要的工作方法。

4、銷毀:Web容器在卸載Web應用程序前,Web容器回調destroy()方法。

Servlet過濾器開發步驟:

1、創建實現javax.servlet.Filter接口的類。

2、過濾器的xml配置。

Servlet過濾器API
Servlet過濾器API包含了3個接口,它們都在javax.servlet包中,分別是Filter接口、FilterChain接口和FilterConfig接口。
publicInterfaceFilter
所有的過濾器都必須實現Filter接口。該接口定義了init,doFilter0,destory()三個方法:
(1)publicvoidinit(FilterConfigfilterConfig)
當開始使用servlet過濾器服務時,Web容器調用此方法一次,為服務準備過濾器;然后在需要使用過濾器的時候調用doFilter(),傳送給此方法的FilterConfig對象,包含servlet過濾器的初始化參數。
(2)publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)
每個過濾器都接受當前的請求和響應,且FilterChain過濾器鏈中的過濾器(應該都是符合條件的)都會被執行。doFilter方法中,過濾器可以對請求和響應做它想做的一切,通過調用他們的方法收集數據,或者給對象添加新的行為。過濾器通過傳送至此方法的FilterChain參數,調用chain.doFilterO將控制權傳送給下一個過濾器。當這個調用返回后,過濾器可以在它的Filter方法的最后對響應做些其他的工作。如果過濾器想要終止請求的處理或得到對響應的完全控制,則可以不調用下一個過濾器,而將其重定向至其它一些頁面。當鏈中的最后一個過濾器調用chain.doFilterO方法時,將運行最初請求的Servlet。
(3)publicvoiddestroy()
一旦doFilterO方法里的所有線程退出或已超時,容器調用
此方法。服務器調用destoryO以指出過濾器已結束服務,用于釋
放過濾器占用的資源。
publicinterfaceFilterChain
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse)
此方法是由Servlet容器提供給開發者的,用于對資源請求過濾鏈的依次調用,通過FilterChain調用過濾鏈中的下一個過濾器,如果是最后一個過濾器,則下一個就調用目標資源。
publicinterfaceFilterConfig
FilterConfig接口檢索過濾器名、初始化參數以及活動的Servlet上下文。該接口提供了以下4個方法:
(1)publicjava.1ang.StringgetFilterName0
返回web.xml部署文件中定義的該過濾器的名稱。
(2)publicServletContextgetServletContextO
返回調用者所處的servlet上下文。
(3)publicjava.1ang.StringgetlnitParameter(java.1ang.Stringname)
返回過濾器初始化參數值的字符串形式,當參數不存在時,返回nul1.name是初始化參數名。
(4)publicjava.util.EnumerationgetlnitParameterNames()
以Enumeration形式返回過濾器所有初始化參數值,如果沒有初始化參數,返回為空。

三、應用實例
從上面分析可知,實現Servlet過濾器,需要兩步:第一步開發過濾器,設計—個實現Fiker接口的類;第二步通過web.xml配置過濾器,實現過濾器和Servlet、JSP頁面之間的映射。以下設計一個簡單的IP地址過濾器,根據用戶的IP地址進行對網站的訪問控制。
(1)過濾器的設計ipfilter.java



package ipf;  
imp0rt java.io.IOException;  
imp0rt javax.servlet.*;  
public class ipfilter implements Filter//實現Filter接口  
{protected FilterConfig config;  
protected String rejectedlP;  
public void init(FilterConfig filterConfig)throws  
ServletException  
  
{this.config=filterConfig;//從Web務器獲取過濾器配置對象  
rejectedlP=config.getlnitParameter( RejectedlP”):  
//從配置中取得過濾lP  
}  
public void doFilter(ServletRequest request,  
ServletResponse response.FilterChain chain)throws  
IOException,ServletException  
{RequestDispatcher dispatcher=request.getRequestDispatcher("");  
String remotelP=request.getRemoteAddrO;//獲取客戶請求lP  
int i=remotelP.1astlndexOf(".");  
int r=rejectedlP.1astlndexOf(”.”):  
String relPscope=rejectedlP.substring(0,r);//過濾lP段  
if(relPscope.equals(remotelP.substring(O.i)))  
{      dispatcher.forward(request,response);//重定向到rejectedError.jsp頁面  
        retum;//阻塞,直接返Web回客戶端  
}  
else{chain.doFilter(request,response);//調用過濾鏈上的下一個過濾器  
}  
}  
public void destroy()  


 

 //過濾器功能完成后,由Web服務器調用執行,回收過濾器資源
注意:chain.doFilterO語句以前的代碼用于對客戶請求的處理;以后的代碼用于對響應進行處理。
(2)配置過濾器
    在應用程序Web—INF目錄下的web.xml描述符文件中添加以下代碼:

[html] view plaincopyprint?
 
<filter>  
<filter-name>ipfIter</filter-name>//過濾器名稱  
<filter-class>ipf.ipfiIter</filter-class>//實現過濾器的類  
<init—param>  
<param—name>RejectedlP</param-name>//過濾器初始化參數名RejectedlP  
<param-value>192.168.12.*/param-value>  
</init—pamm>  
</filter>  
<filter-mapping>//過濾器映射(規律規則)  
<filter-name>ipfiIter</filter-name>  
<url—pattem>/*</ud-pattem>  
//映射到Web應用根目錄下的所有JSP文件  
</filter-mapping>  

  

通過以上設計與配置,就禁止了IP地址處在192.168.12網段的用戶對網站的訪問。

監聽器

一、監聽器概述

監聽你的web應用,監聽許多信息的初始化,銷毀,增加,修改,刪除值等

Servlet監聽器用于監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生后可以做一些必要的處理。

1.Listener是Servlet的監聽器

2.可以監聽客戶端的請求、服務端的操作等。

3.通過監聽器,可以自動激發一些操作,如監聽在線用戶數量,當增加一個HttpSession時,給在線人數加1。

4.編寫監聽器需要實現相應的接口

5.編寫完成后在web.xml文件中配置一下,就可以起作用了

6.可以在不修改現有系統基礎上,增加web應用程序生命周期事件的跟蹤

servlet規范中為每種事件監聽器都定義了相應的接口,在編寫事件監聽器程序時只需實現這些接口就可以了。一些Servlet事件監聽器需要在web應用程序的部署文件描述符文件(web.xml)中進行注冊(注冊之后才能發布),一個web.xml可以注冊多個servlet事件監聽器。web服務器按照它們在web.xml中注冊順序來加載和注冊這些servlet事件監聽器。servlet事件監聽器的注冊和調用過程都是由web容器自動完成的,當發生被監聽對象被創建,修改,銷毀等事件時,web容器將調用與之相關的servlet事件監聽器對象的相應方法(所監聽到的對象如果在創建、修改、銷毀事件觸發的時候就會調用這些監聽器這就相當于面向事件編程的概念),用戶在這些方法中編寫的事件處理代碼(相當于JS中的事件響應)即被執行。由于在一個web應用程序中只會為每個事件監聽器類創建一個實例對象,有可能出現多個線程同時調用一個事件監聽對象的情況,所以要注意多線程安全問題。

二、監聽器類型

按監聽的對象劃分:servlet2.4規范定義的事件有三種:

1.用于監聽應用程序環境對象(ServletContext)的事件監聽器

2.用于監聽用戶會話對象(HttpSession)的事件監聽器

3.用于監聽請求消息對象(ServletRequest)的事件監聽器

按監聽的事件類項劃分

1.用于監聽域對象自身的創建和銷毀的事件監聽器

2.用于監聽域對象中的屬性的增加和刪除的事件監聽器

3.用于監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器

在一個web應用程序的整個運行周期內,web容器會創建和銷毀三個重要的對象,ServletContext,HttpSession,ServletRequest。

PS:其中Context為JSP頁面包裝頁面的上下文.由容器創建和初始化,管理對屬于JSP中特殊可見部分中已命名對象的訪問.該接口用來定義了一個Servlet的環境對象。也可認為這是多個客戶端共享的信息,它與session的區別在于應用范圍的不同,session只對應于一個用戶。

servlet2.4中定義了三個接口:

ServletContextListener,HttpSessionListener,ServletRequestListener。分別實現對應的接口就可以實現對應的監聽處理

在ServletContextListener接口中定義了兩個事件處理方法,分別是

contextInitialized()和contextDestroyed()

publicvoidcontextInitialized(ServletcontextEventsce)

這個方法接受一個ServletContextEvent類型參數,在contextInitialized可以通過這個參數獲得當前被創建的ServletContext對象。

publicvoidcontextDestroyed(ServletContextEventsce)

2.在HttpSessionListneter接口中共定義了兩個事件處理方法,分別是sessionCreated()和sessionDestroyed()

publicvoidsessionCreated(HttpSessionEventse)

這個方法接受一個(HttpSessionEvent類型參數,在sessionCreated可以通過這個參數獲得當前被創建的HttpSession對象。

publicvoidsessionDestroyed(HttpSessionEventse)

3.在ServletRequestListener接口中定義了兩個事件處理方法,分別是requestInitialized()和requestDestroyed()

publicvoidrequestInitialized(ServletRequestEventsre)

這個方法接受一個(ServletRequestEvent類型參數,在requestInitialized可以通過這個參數獲得當前被創建的ServletRequest對象。

publicvoidrequestDestroyed(ServletRequestEventsre)

可以看出三個監聽器接口中定義的方法非常相似,執行原理與應用方式也相似,在web應用程序中可以注冊一個或者多個實現了某一接口的事件監聽器,web容器在創建或銷毀某一對象(如ServletContext,HttpSession)時就會產生相應的事件對象

(如ServletcontextEvent,或者HttpSessionEvent),接著依次調用每個事件監聽器中的相應處理方法,并將產生的事件對象傳遞給這些方法。

三、分類及介紹

1.ServletContextListener:用于監聽WEB應用啟動和銷毀的事件,監聽器類需要實現javax.servlet.ServletContextListener接口。

2.ServletContextAttributeListener:用于監聽WEB應用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監聽器類需要實現javax.servlet.ServletContextAttributeListener接口。

3.HttpSessionListener:用于監聽Session對象的創建和銷毀,監聽器類需要實現javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者兩個都實現。

4.HttpSessionActivationListener:用于監聽Session對象的鈍化/活化事件,監聽器類需要實現javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者兩個都實現。

5.HttpSessionAttributeListener:用于監聽Session對象屬性的改變事件,監聽器類需要實現javax.servlet.http.HttpSessionAttributeListener接口。

四、部署

監聽器的部署在web.xml文件中配置,在配置文件中,它的位置應該在過濾器的后面Servle的前面

五、示例

第一步:編寫監聽器類

 
package cn.listen;  
  
import javax.servlet.ServletContextEvent;  
  
import javax.servlet.ServletContextListener;  
  
  
public class MyListener implements ServletContextListener {  
  
    public void contextDestroyed(ServletContextEvent sce) {  
  
           System.out.println("die");  
  
    }  
  
    public void contextInitialized(ServletContextEvent sce) {  
  
           System.out.println("init");   
  
    }  
  
}   

第二步:布置安裝

<listener>

<listener-class>cn.listen.MyListener</listener-class>

</listener>

運行服務器會出現

[20:42:38.406]{main}WebApp[http://default]active

init

[20:42:38.437]{main}WebApp[http://default/MyProj]active

監聽到了應用啟動。

總結

以上是生活随笔為你收集整理的(转)过滤器原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 老熟妇一区二区三区啪啪 | 免费日皮视频 | av网址免费在线观看 | 欧美日韩综合 | 国产一二三区精品 | 日韩中文字幕在线看 | 欧美国产在线观看 | 新版天堂资源中文8在线 | 国产精品系列在线播放 | 欧美丰满艳妇bbwbbw | 精品国产乱码久久久久久牛牛 | 国产精品一区2区 | 懂色a v| 久久久久国产视频 | 中文字幕日韩国产 | 女人16一毛片 | 91艹 | 99久久久久久久久 | 免费国产羞羞网站视频 | 国产成人av电影 | 在线观看的av| 性感av在线 | 午夜一二区 | a在线免费 | 在线天堂中文 | 蜜桃网av | 怡红院成永久免费人全部视频 | 91a视频| 亚洲一级av无码毛片精品 | 视频福利一区 | av超碰 | 久久久国产精品免费 | 男性影院 | 波多野一区 | 亚洲男女激情 | 久久av高潮av无码av喷吹 | 一本一道波多野结衣一区二区 | 日本少妇大战黑人 | 黄页网站在线看 | 天天插夜夜 | 成人福利社 | 在线亚洲不卡 | 久久久免费精品视频 | 毛片视频免费播放 | 淫视频在线观看 | 草草在线观看视频 | 激情四射综合网 | 99re这里只有精品首页 | 亚洲国产精品久 | 污污免费视频 | 国产男人搡女人免费视频 | 一级片久久久 | 鲁鲁狠狠狠7777一区二区 | 高清成人 | 色婷婷在线影院 | 嫩草视频91| 久久久久久久久久久久久久av | 亚洲精品日本 | 亚洲精品一区二区在线观看 | 日本一级吃奶淫片免费 | av网站观看 | 亚洲熟女www一区二区三区 | 99九九久久| 清纯粉嫩极品夜夜嗨av | 欧美裸体xxxx极品少妇 | 久久久久亚洲AV成人无码国产 | 精品久久久久久一区二区里番 | 亚洲a成人 | 91最新视频 | 国产日韩欧美一区二区 | 青青草视频在线免费观看 | 国产一区二区黄色 | 伊人影院视频 | 亚洲我射 | 久久国产精品99久久人人澡 | 精品一区二区三区视频日产 | 大陆女明星乱淫合集 | 伊人久久成人网 | 美女高潮在线 | 国产一区一一区高清不卡 | 色婷婷狠狠 | 国产一区二区网 | 天堂va欧美ⅴa亚洲va一国产 | 国产一区二区三区观看 | 国产成人精品一区二三区四区五区 | 久久久久一区 | 国内自拍网站 | 亚洲做受高潮无遮挡 | 91福利一区 | 另类视频在线观看 | 色版视频 | www..com国产 | 欧美日韩不卡一区二区三区 | 免费看黄色小视频 | 干b视频在线观看 | 天天做天天干 | 色婷综合 | 亚洲色图丝袜美腿 | 国产精品国产三级国产专播精品人 |