1. 程式人生 > >servlet 和 filter執行順序

servlet 和 filter執行順序

在我們寫程式碼時,在web.xml中總能發現類似下面的程式碼:

  1. <spanstyle="font-family:KaiTi_GB2312;font-size:18px;"><spanstyle="font-family:KaiTi_GB2312;font-size:18px;"><?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee      
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6.     <welcome-file-list>
  7.         <welcome-file>index.jsp</welcome-file>
  8.     </welcome-file-list>
  9.     <filter>
  10.         <filter-name>firstFilter</filter-name
    >
  11.         <filter-class>com.test.filter.FirstFilter</filter-class>
  12.     </filter>
  13.     <filter>
  14.         <filter-name>secondFilter</filter-name>
  15.         <filter-class>com.test.filter.SecondFilter</filter-class>
  16.     </filter>
  17.     <filter-mapping>
  18.         <filter-name>secondFilter</filter-name>
  19.         <url-pattern>/*</url-pattern>
  20.     </filter-mapping>
  21.     <filter-mapping>
  22.         <filter-name>firstFilter</filter-name>
  23.         <url-pattern>/*</url-pattern>
  24.     </filter-mapping>
  25.     <servlet>
  26.         <servlet-name>firstServlet</servlet-name>
  27.         <servlet-class>com.alimama.servlet.FirstServlet</servlet-class>
  28.     </servlet>
  29.     <servlet-mapping>
  30.         <servlet-name>firstServlet</servlet-name>
  31.         <url-pattern>/firstServlet</url-pattern>
  32.     </servlet-mapping>
  33. </web-app>
  34. </span></span>

    這個web.xml就涉及到了filter與servlet,那麼他們兩個有什麼區別與聯絡呢?

1. Filter
    實現javax.servlet.Filter介面,在web.xml中配置與標籤指定使用哪個Filter實現類過濾哪些URL連結。只在web啟動時進行初始化操作。

    filter 流程是線性的, url傳來之後,檢查之後,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理之後,不會繼續向下傳遞。filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。

    在filter介面要實現三個方法:init(),destroy(),dofilter();分別是初始化,析構,和過濾,其中大部分時間花費在doFilter()方法上

    特點:可以在響應之前修改Request和Response的頭部,只能轉發請求,不能直接發出響應。filter可用來進行字元編碼的過濾,檢測使用者是否登陸的過濾,禁止頁面快取等   

    1).filter的init方法在容器初始化時載入。第一次載入容器執行順序隨機,以後再次載入順序以第一次載入順序為準。

    2).filter的doFilter方法在請求url時執行,如果有多個filter匹配,則按照<filter-mapping>順序執行(前提是doFilter方法裡面最後要呼叫FilterChain的doFilter方法,這個方法作用是繼續執行下個filter,如果沒有加,則不執行下面的filter)


2. Servlet
    servlet 流程是短的,url傳來之後,就對其進行處理,之後返回或轉向到某一自己指定的頁面。它主要用來在業務處理之前進行控制。

    servlet繼承與servlet介面,實現方法:init(),service(),destroy(),getServletConfig(),getServletInfo()方法。在呼叫時service方法時會根據請求方式呼叫doget()或者dopost()方法;

    serlvet的init方法

    1).如果web.xml中配置了<load-on-startup>屬性,則在Tomcat初始化時按其值從小到大的順序載入所有servlet的init方法。

    2).如果沒有配置<load-on-startup>屬性,容器初始化時不載入。在請求匹配的url時進行載入,並且只加載最後一個servlet的init方法。其他的servlet不載入。

    3).servlet的doGet、doPost方法:在請求匹配的url路徑時載入,而且只加載最後一個servlet的方法,其他方法不載入。

    filter和servlet同時存在,且容器初始化都要載入,則先載入filter再載入servlet的init方法。

    如果請求的url既匹配filter又匹配servlet,並且servlet的init方法沒有在容器初始化載入,則先載入匹配的servlet的最後一個servlet的init方法,再按順序執行filter方法,最後再執行匹配的最後一個servlet方法

     在網上看到一張圖與大家分享: 

Filter

Servlet

介面

實現Filter介面

實現Servlet介面

使用步驟

1、建立類,繼承介面

2、實現方法

init()

doFilter()

destroy()

3、配置WEB-INF/web.xml

1、建立類,繼承介面

2、實現方法

init()

service()

destroy()

getServletConfig()

getServletInfo()

3、配置WEB-INF/web.xml

初始化時間

Servlet容器啟動之後即初始化

Servlet類被呼叫之後初始化、先於Filter呼叫。

初始化可以在容器啟動後被呼叫但需要配置。

呼叫順序

1. 按照web.xml中的對映配置順序按照配置條件從後向前呼叫

2. 層次呼叫doFilter()方法中FilterChain.doFilter()之前的內容

3. 呼叫Servlet中的service()方法

4. service方法執行完畢後,層次呼叫doFilter()中FilterChain.doFilter()之後的方法,順序與之前的相反

按照web.xml中的對映配置順序按照配置條件從後向前呼叫第一個滿足條件的Servlet,呼叫之前事先執行滿足條件的Filter,不存在層次呼叫Servlet問題

銷燬

伺服器停止後銷燬,晚於Servlet銷燬之後

伺服器停止後銷燬

作用

1. 在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。

2. 根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和資料。

3. 在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。

4. 根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和資料。

主要是處理客戶端的請求並將其結果傳送到客戶端。

    filter的初始化是在servlet容器啟動時,而Servlet類被呼叫之後初始化、先於Filter呼叫。初始化可以在容器啟動後被呼叫但需要配置。(filter的初始化根據在web.xml中filter的宣告順序,注意filtermapping必須放在filter宣告之後使用。servlet被呼叫初始化,先於filter呼叫,是指chain.fiter(),service(),chainfiter()之後的程式碼)

    呼叫順序:filter的呼叫順序:

    1. 按照web.xml中的對映配置順序按照配置條件從後向前呼叫

    2. 層次呼叫doFilter()方法中FilterChain.doFilter()之前的內容(filter-mapping的name先呼叫doFilter方法,但是每個dofilter方法的內部存在chain.dofilter會呼叫下一個filter-mapping,一直到不存在下一個filter後在返回,執行chain.dofilter()後面的程式碼)(相當於遞迴呼叫)

    3. 呼叫Servlet中的service()方法

    4. service方法執行完畢後,層次呼叫doFilter()中FilterChain.doFilter()之後的方法,順序與之前的相反

    servlet的呼叫順序:

    按照web.xml中的對映配置順序按照配置條件從後向前呼叫第一個滿足條件的Servlet,呼叫之前事先執行滿足條件的Filter,不存在層次呼叫Servlet問題

    當然咱們通俗易懂的來講,filter就是用來攔截進行一些日誌類似aop的功能,而servlet就是轉發到別的頁面。filter我們可以不配置也就不用,但是目前所有程式碼基本上都配置了servlet。

相關推薦

servlet filter執行順序

在我們寫程式碼時,在web.xml中總能發現類似下面的程式碼: <spanstyle="font-family:KaiTi_GB2312;font-size:18px;"><spanstyle="font-family:KaiTi_GB2312;

servlet filter的區別

com 檢查 功能 邏輯判斷 一個 編碼 客戶 cnblogs 應用 filter與servlet區別 filter: 1.線性流程:url傳來之後,檢查之後,可保持原來的流程繼續向下執行,被下一個filter, servlet接收; 2

從矩陣乘法來看-O優化ijk執行順序對程式效能的影響

從矩陣乘法來看-O優化和ijk執行順序對程式效能的影響 根據計算矩陣乘積的c程式,主要想做想做兩件事情: 統計採用不同的優化選項編譯程式所用的時間,感受-O優化帶來的效能提升。 看看矩陣乘法中不同迴圈順序對程式效能的影響: 改變三重迴圈的順序,統

javaweb專案,過濾器的配置方式是註解@WebFilter時,過濾鏈filter執行順序的控制方法!

      當過濾器用web.xml配置時,控制多個filter的執行順序是通過web.xml中控制filter的位置來控制的,放在上面的會比放在下面的先執行,如“使用者登入檢查過濾器”會比“介面日誌過濾器”先執行,這種方式一搜一大堆。       用@WebFilter註

printf()scanf()執行順序

原始碼:void main(){int a,b,c,x2,y2;printf("輸入a,b,c:\n");scanf("%d%d%d",&a,&b,&c);result(a,b,c,&x2,&y2);test(a,b,c,x2,y2);

spring [email protected]bean執行順序問題

從配置檔案中獲取配置使用@value,當你在bean載入時呼叫@value時會出現空指標異常。因為bean載入完成後才會執行@value。    解決辦法:spring boot 有兩種獲取配置檔案值的方式 第一種,@value(“${a.b}”)傳屬性名稱 第二種:使

JS事件機制:事件繫結、事件監聽、事件委託(代理)事件執行順序總結

JS 對於使用者的操作做出響應,就必須對DOM元素繫結事件處理函式 事件繫結  1、在DMO中直接繫結事件 <input type="button" value="click me"

Servlet Filter的生命週期(springboot測試servletfilter

servlet生命週期: 通過建構函式例項化Servlet物件; 當第一次瀏覽器向伺服器傳送請求,訪問servlet; 呼叫init方法進行初始化 (servlet物件一般只有一個,會常駐記憶體)  init方法只會呼叫一次; 開啟一個執行緒,去呼叫s

ServletFilter的區別聯絡

一.  概念方面: 1. servlet是一種執行與伺服器端的java應用程式,具有獨立於平臺和協議的特徵,並且可以動態的生成web頁面,它工作在客戶端請求和服務端相應的中間層。 2. filter是一個可以複用的程式碼片段,可以用來轉換HTTP請求、響應和頭資訊。filter不像servlet,它

SQL語句中的ANDOR執行順序問題

情景:一個搜尋框 可以同時根據使用者賬號或者使用者名稱字 搜尋匹配條件的使用者 如果搜尋框中沒有搜尋條件 則查出所有教師使用者 遇到的問題: 查詢條件時為輸入框內的內容 先在資料庫中模擬測試 結果

Script標籤指令碼執行順序

0.前言 估計所有讀者也慢慢適應我每次講東西之前先墨跡一段的習慣了。 那麼我今天就來個轉換,我!不!墨!跡!了! 正文開始。 1.script標籤的預設行為 首先我們先來看一下 <script> 標籤 的幾個重要特性: scri

ServletFilter對映匹配原則之異同

以前總以為Filter是一種特殊的Servlet,所以它們在web.xml中的配置應該是一樣,可現在發現並非如此。請看下文: 一、servlet容器對url的匹配過程: 當一個請求傳送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為servlet的對映url,比如我訪問的是

Filter 執行順序介紹

Filter介紹  Filter可認為是Servlet的一種“變種”,它主要用於對使用者請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。它與Servlet的區別在於:它不能直接向用戶生成響應。完整的流程是:Filter對使用者

關於Filter執行順序的探究

今天研究一下Filter的執行順序問題。首先,我寫了三個Filter三個Filter的內容是一樣的,用不同列印來區分,這裡我只給出FirstFiler為例package com.zhwy.filters; import java.io.IOException; import

從join onwhere執行順序認識T-SQL查詢處理執行順序

SQL語句中join連表時on和where後都可以跟條件,那麼對查詢結果集,執行順序,效率是如何呢? 通過查詢資料發現:區別:on是對中間結果進行篩選,where是對最終結果篩選。執行順序:先進行on的過濾, 而後才進行join。效率:如果是inner join, 放o

JUnit學習筆記13---對servletfilter進行單元測試2

package junitbook.servlets; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.servlet.ServletException; impor

Web.xml中設定ServletFilter時的url-pattern匹配規則

① 完全匹配 /test/list.do ② 目錄匹配 /test/*  ③ 副檔名匹配 *.do servlet-mapping的重要規則:       ☆ 容器會首先查詢完全匹配,如果找不到,再查詢目錄匹配,如果也找不到,就查詢副檔名匹配。       ☆ 如果一個請求

JSCSS執行順序

一、指令碼和樣式表載入、執行順序總結1、指令碼web的模式是同步的,開發者希望解析到一個script標籤時立即解析執行指令碼,並阻塞文件的解析直到指令碼執行完。如果指令碼是外引的,則網路必須先請求到這個資源——這個過程也是同步的,會阻塞文件的解析直到資源被請求到。這個模式保持了很多年,並且在html4及htm

filterservlet執行順序關係

先走filter,然後走servlet,然後回到filter,一個filter可以用chain.doFilter()分成前後兩部分。 filterA: public void doFilter(

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

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