1. 程式人生 > >Filter(過濾器)、Listener(監聽器)

Filter(過濾器)、Listener(監聽器)

Servlet API中提供了一個Filter介面,開發web應用時,如果編寫的Java類實現了這個介面,則把這個java類稱之為過濾器Filter。通過Filter

技術,開發人員可以實現使用者在訪問某個目標資源之前,對訪問的請求和響應進行攔截。它使使用者可以改變一個request和修改一個response. Filter

不是一個servlet,它不能產生一個response,它能夠在一個request到達servlet之前預處理request,也可以在response離開servlet時處理response.

換種說法,filter其實是一個“servlet chaining“(servlet 鏈)。

包括

1. 在servlet被呼叫之前截獲;

2. 在servlet被呼叫之前檢查servlet request;

3. 根據需要修改request頭和request資料;

4. 根據需要修改response頭和response資料;

5. 在servlet被呼叫之後截獲.

實現步驟:

1.建立一個類implements Filter。

2、實現doFilter()方法。
3、在web.xml中進行配置(參照Servlet配置)

eg.

<filter-mapping> 
    <filter-name>Demo1Filter</filter-name> 


    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> <!-- 沒有配置dispatcher就是預設request方式的 --> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 

4、訪問一個頁面,看看能不能攔截.

Filter的應用場景:
通過對filter過濾器的瞭解,可以得知在以下三種情況下可以做些處理:
1> 通過控制對chain.doFilter的方法的呼叫,來決定是否需要訪問目標資源。
比如,可以在使用者許可權驗證等等。判斷使用者是否有訪問某些資源的許可權,有許可權放行,沒許可權不執行chain.doFilter方法。
2> 通過在呼叫chain.doFilter方法之前,做些處理來達到某些目的。
比如,解決中文亂碼的問題等等。可以在doFilter方法前,執行設定請求編碼與響應的編碼。甚至可以對request介面進行封裝裝飾來處理

get請求方式的中文亂碼問題(重寫相應的request.getParameter方法)。
3> 通過在呼叫chain.doFilter方法之後,做些處理來達到某些目的。
比如對整個web網站進行壓縮。在呼叫chain.doFilter方法之前用類A對response物件進行封裝裝飾,重寫getOutputStream和重寫getWriter

方法。在類A內部中,將輸出內容快取進ByteArrayOutputStream流中,然後在chain.doFilter方法執行後,獲取類A中ByteArrayOutputStream

流快取資料,用GZIPOutputStream流進行壓縮下。

eg.

Filter生命週期:
和Servlet一樣Filter的建立和銷燬也是由WEB伺服器負責。不過與Servlet區別的是,它是

1>在應用啟動的時候就進行裝載Filter類(與Servlet的load-on-startup配置效果相同)。

2>容器建立好Filter物件例項後,呼叫init()方法。接著被Web容器儲存進應用級的集合容器中去了等待著,使用者訪問資源。

3>當用戶訪問的資源正好被Filter的url-pattern攔截時,容器會取出Filter類呼叫doFilter方法,下次或多次訪問被攔截的資源時,Web

容器會直接取出指定Filter物件例項呼叫doFilter方法(Filter物件常駐留Web容器了)。

4>當應用服務被停止或重新裝載了,則會執行Filter的destroy方法,Filter物件銷燬。
注意:init方法與destroy方法只會直接一次。

Listener 監聽器

監聽器Listener就是在application,session,request三個物件建立、銷燬或者往其中新增修改刪除屬性時自動執行程式碼的功能元件。Listener

是Servlet的監聽器,可以監聽客戶端的請求,服務端的操作等。

Listener的分類與使用

  主要有以下三類:

  1、ServletContext監聽

  ServletContextListener:用於對Servlet整個上下文進行監聽(建立、銷燬)。

public void contextInitialized(ServletContextEvent sce);//上下文初始化
public void contextDestroyed(ServletContextEvent sce);//上下文銷燬

public ServletContext getServletContext();//ServletContextEvent事件:取得一個ServletContext(application)物件

  ServletContextAttributeListener:對Servlet上下文屬性的監聽(增刪改屬性)。

public void attributeAdded(ServletContextAttributeEvent scab);//增加屬性
public void attributeRemoved(ServletContextAttributeEvent scab);//屬性刪除
public void attributeRepalced(ServletContextAttributeEvent scab);//屬性替換(第二次設定同一屬性)

//ServletContextAttributeEvent事件:能取得設定屬性的名稱與內容
public String getName();//得到屬性名稱
public Object getValue();//取得屬性的值

2、Session監聽

  Session屬於http協議下的內容,介面位於javax.servlet.http.*包下。

  HttpSessionListener介面:對Session的整體狀態的監聽。

public void sessionCreated(HttpSessionEvent se);//session建立
public void sessionDestroyed(HttpSessionEvent se);//session銷燬

//HttpSessionEvent事件:
public HttpSession getSession();//取得當前操作的session

  HttpSessionAttributeListener介面:對session的屬性監聽。

public void attributeAdded(HttpSessionBindingEvent se);//增加屬性
public void attributeRemoved(HttpSessionBindingEvent se);//刪除屬性
public void attributeReplaced(HttpSessionBindingEvent se);//替換屬性

//HttpSessionBindingEvent事件:
public String getName();//取得屬性的名稱
public Object getValue();//取得屬性的值
public HttpSession getSession();//取得當前的session

 3、Request監聽

  ServletRequestListener:用於對Request請求進行監聽(建立、銷燬)。

public void requestInitialized(ServletRequestEvent sre);//request初始化
public void requestDestroyed(ServletRequestEvent sre);//request銷燬

//ServletRequestEvent事件:
public ServletRequest getServletRequest();//取得一個ServletRequest物件
public ServletContext getServletContext();//取得一個ServletContext(application)物件

  ServletRequestAttributeListener:對Request屬性的監聽(增刪改屬性)。

public void attributeAdded(ServletRequestAttributeEvent srae);//增加屬性
public void attributeRemoved(ServletRequestAttributeEvent srae);//屬性刪除
public void attributeReplaced(ServletRequestAttributeEvent srae);//屬性替換(第二次設定同一屬性)

//ServletRequestAttributeEvent事件:能取得設定屬性的名稱與內容
public String getName();//得到屬性名稱
public Object getValue();//取得屬性的值

4、在web.xml中配置

  Listener配置資訊必須在Filter和Servlet配置之前,Listener的初始化(ServletContentListener初始化)比Servlet和Filter都優先,而銷燬比Servlet和Filter都慢。

<listener>
    <listener-class>com.listener.class</listener-class>
</listener>

簡單示例:

統計線上人數:

相關推薦

Filter(過濾器)Listener(監聽器)

Servlet API中提供了一個Filter介面,開發web應用時,如果編寫的Java類實現了這個介面,則把這個java類稱之為過濾器Filter。通過Filter 技術,開發人員可以實現使用者在訪問某個目標資源之前,對訪問的請求和響應進行攔截。它使使用者可以改變一個re

Filter過濾器listener監聽器的簡單使用

Filter過濾器是一種對客戶端訪問的過濾技術,簡單來說就是我們瀏覽器訪問伺服器檔案時,如果設定了特定的過濾配置,則會先經過過濾器,然後再將請求放給伺服器去執行,最常見的就是我們過濾使用者是否登入的使用。 listener監聽器,見名得意,他就是起到一個監聽的作用,主要是用來監聽web應用的建立

filter過濾器listener監聽器

一、filter過濾器 可對伺服器管理的所有資源進行攔截。 原理示意圖: 3個方法: public void init(FilterConfig config) throws ServletException public void doFilter(Serv

Filter過濾器Listener監聽器的的用法和區別

過濾器Filters 概要 過濾器的作用 過濾器的說明 Filer介面的生命週期 Filter的實現與配置 spring自帶的字元編碼過濾器 Liste

URL重寫Filter(過濾器)監聽器(Listener)

14.URL重寫     也屬於會話追蹤技術的一種.     URL重寫解決了這樣一個問題:     當前瀏覽器把cookie禁用之後,瀏覽器在發請求的時候,就不會把cookie帶到伺服器端了(其中最重要的也包括JSESSIONID),因為禁用cookie之後瀏覽器拒絕一切

EL表示式和jstl技術filter過濾器JAVA反射

三天看了三種新技術的教學視訊作為jsp學習的收尾吧,前幾天留言板小樣例的課堂講解反饋效果極差,其中一個原因就是裡面的程式碼太亂,顯示頁面巢狀過多java的邏輯程式碼,顯得極不規範,所以就想用EL表示式結合jstl的一些標籤儘量使得程式碼能夠整潔規範一些,剛好也可以將新學的東西運用在結課的課程設計

過濾器/攔截器/監聽器 —— FilterInterceptorListener

在服務器 jsp ext resp 應用 改變 每次 常用 fff 一、Filter的功能 filter功能,它使用戶可以改變一個 request和修改一個response. Filter 不是一個servlet,它不能產生一個response,它能夠在一個request到

Filter過濾器Listener監聽器)【Servlet總結】

Filter Filter攔截請求和響應,以便檢視、提取或以某種方式操作正在客戶機和伺服器之間交換的資料,可以改變一個請求(request)或者修改響應(respond)。使用者傳送請求給Servlet時,在Servlet處理請求之前,與此Servlet相關的Filter首

Java Web組件ServletFilterListener

繼承 一個 tex 請求 父類 服務器 監聽 alt tco 一、Servlet 類javax.servlet.http.HttpServlet; 1.是單例模式,一個web容器中只有一個實例。服務器調用它的service方法進行請求處理, service方法

6.28筆記-servlet3.0註解配置文件上傳過濾器監聽器

對象 color ctype url ext string 實現 ins web服務器 一、servlet3.0註解配置 使用javaEE6.0 支持servlet3.0 value的值就是訪問路徑 urlPatterns的值也是訪問路

Servlet過濾器監聽器對象的實例化和銷毀的優先級

servlet優先級實例化時:監聽器-->過濾器-->Servlet銷毀時:過濾器-->Servlet-->監聽器Servlet實例化的順序:若設置了loadOnStartUp屬性值≥0,則在Wed容器開啟的時候就實例化,否則訪問時實例化;如果Servlet是在Web.xml文件中配置

Filter過濾器(自動登陸通用的字符集編碼的過濾【處理不同請求的亂碼問題】。。。)

XML under amt 有關 filter過濾器 pre 繼承 擴展名 獲取 Filter過濾器:可以過濾(攔截)從客戶端向服務器發送的請求。 過濾器的作用:   進行ip的過濾,臟話敏感詞語的過濾,自動登陸,響應壓縮。。。 過濾器的使用:   1.編寫類實現Filte

SpringBoot註冊Fiter(過濾器)和Listener監聽器

一、SpingBoot註冊Filter    1、建立filter類及其註冊配置類,用於過濾某些需要登陸後才可以訪問的介面 自定義過濾器 @Component public class PayFilter implements Filter { @Override

JavaWeb的三大元件 ServletListenerFilter

1.Servlet Servlet 是一個 Java程式,是在伺服器上執行以處理客戶端請求並做出響應的程式  Servlet的生命週期 是一個servlet的從初始化(出生)到銷燬(死亡)。   Init() -> service() -

攔截器過濾器監聽器各有什麼作用?

這裡是修真院後端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】 八個方面深度解析後端知識/技能,本篇分享的是: 【攔截器、過濾器、監聽器各有什麼作用?】   大家好,我是IT修真院鄭州分院第

Spring Boot-- ServletFilterListenerInterceptor

Spring Boot-- Servlet、Filter、Listener、Interceptor 在Spring Boot中讓Servlet、Listener、Filter生效的方法: 在Application上使用@ServletComponentSc

spring中過濾器filter攔截器(interceptor)和切面(aop)的執行順序

1.程式執行的順序是先進過濾器,再進攔截器,最後進切面。注意:如果攔截器中preHandle方法返回的為false時,則無法進入切面,例子如下 @RestController @RequestMapping("/user") public class UserController {

Spring Boot 註冊Servlet三大元件ServletFilterListener

由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案 public class MyServlet extends HttpServlet { protected void doPost(HttpS

springboot的servetfilterlistener的註冊配置

使用springboot時,它提倡減少大量的配置檔案。從原理上是因為springboot為我們整合封裝了很多框架。甚至是在我們在建立web專案時,使用的web.xml也都給廢棄了。但是,如果我們使用傳統的servlet、filter、listener,如何進行配置,此篇文章就是解決這個問題具體方案有

SpringBoot1.5.12.RELEASE註冊Servlet三大元件【ServletFilterListener

SpringBoot1.5.12.RELEASE註冊Servlet三大元件【Servlet、Filter、Listener】 1.理由:由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案。 2.註