Java編程:過濾器和攔截器有啥區別,這次會了!

2020-12-13 計算機java編程

這個是不久前在面試的時候遇到的一個問題,當時直接懵了,兩個單拎出來,雖然不太完全,但都大概知道可以對請求進行攔截,放在一起比較,可真是頭疼。

其實之前面試完就去學習了一波,只不過那個時候沒及時總結,現在總結一下,以免日後遇到這類問題又給忘咯。

要理解這類問題,光靠死記硬背可能當時有用,過一陣子就差不多忘了。要想真的牢記,我們必須要實操一下。

Filter的使用

首先,要使用Filter,必須實現javax.servlet.Filter接口:

init和destroy是default方法,實現類可以不用實現。doFilter必須實現,也就是說,作為一個過濾器,doFilter必須要定義。doFlilter方法中傳進來的FilterChain對象用來調用下一個過濾器。攔截器的使用

過濾器與攔截器到底有啥區別呢?

一、實現原理不同

過濾器的實現基於回調函數攔截器基於Java的反射機制【動態代理】實現。二、使用範圍不同

過濾器是Servlet的規範,需要實現javax.servlet.Filter接口,Filter使用需要依賴於Tomcat等容器。攔截器是Spring組件,定義在org.springframework.web.servlet包下,由Spring容器管理【又有更加豐富的生繆那個周期處理方法,細粒度,且能夠使用Spring中的資源】,不依賴Tomcat等容器。三、觸發時機不同

這一段在HandlerInterceptor類的注釋上可以發現,兩者的觸發時機是不同的:

過濾器:對請求在進入後Servlet之前或之後進行處理。攔截器:對請求在handler【Controller】前後進行處理。

四、執行順序不同

同時配置了過濾器和攔截器的情形:

過濾器的順序每一次都將chain對象傳入,達到最後接口回調的效果:

攔截器的順序preHandle1 -> preHande2 -> 【Controller】 -> postHandle2 -> postHandle1 -> afterCompletion2 -> afterComplention1

preHandle按照註冊順序,後兩個與註冊順序相反。

一個攔截器的preHandle為false,則之後的所有攔截器都不會執行。一個攔截器的preHandle為true,則這個攔截器的triggerAfterCompletion一定會執行。只有所有的攔截器preHandler都為true,也就是正常執行,postHandle才會執行。

五、控制執行順序方式不同

兩者默認都是使用註冊順序,如果想要認為控制執行的順序,方式略有不同:

過濾器如果想要強制改變,可以使用@Order註解。攔截器如果使用order()方法

總結

相關焦點

  • 過濾器和攔截器的區別,這次終於懂了
    public default void destroy() {}}init和destroy是default方法,實現類可以不用實現。doFilter必須實現,也就是說,作為一個過濾器,doFilter必須要定義。doFlilter方法中傳進來的FilterChain對象用來調用下一個過濾器。
  • 過濾器 和 攔截器 6個區別,別再傻傻分不清了
    周末有個小夥伴加我微信,向我請教了一個問題:老哥,「過濾器 (Filter) 和 攔截器 (Interceptor) 有啥區別啊?」 聽到題目我的第一感覺就是:「簡單」!和 攔截器 均體現了AOP的編程思想,都可以實現諸如日誌記錄、登錄鑑權等功能,但二者的不同點也是比較多的,接下來一一說明。
  • 哪種程式語言適合後端開發,Java和PHP的區別在哪
    IT行業程序人員使用哪種程式語言一直都是大家討論的熱點,尤其是程式設計師們在面試的過程中還會被面試官們問到Java和PHP語言的區別是什麼? 如果從技術上看在web開發上,Java和PHP哪個更好呢?關於這一說法,你會有怎樣的見解。 java已經是一門很成熟的語言,曾經看到一篇文章,講程式語言的進化,其中提到,java語言的進化樹太全了,使得其沒有發展的空間php是在web繁榮之後興起的語言,所以語言成熟度沒有java高,但PHP有一個最大的優點就是語法簡潔靈活。
  • 要準備多少東西去面試---java中高級面試總結(值得收藏)
    常用的 Java 核心包 (Java Core Package)java.lang  Java 程式語言的基本類庫(Object、String、StringBuffer、StringBuilder、System、Runtime、Throwable、Exception、Error、Thread、Math等)java.io 通過數據流、對象序列以及文件系統實現的系統輸入
  • 學習java需要會哪些知識才能夠去應聘工作?
    我們會先講解了Java程序的開發環境的搭建、編寫流程、工作原理等內容,接著學習有關Java編程的基本知識:包括變量、條件語句、循環語句、數組等內容,然後我們需要花幾天的時間學習什麼是面向對象。有了面向對象的基礎後,然後我們可以分別學習jdk提供的包的各個常用類的使用,包括lang包,io包,util包等等。接著學習線程,swing和網絡編程。最後我們會完成一個多人聊天項目,結束這個階段。
  • Java之FileFilter過濾器的使用與及原理的簡單介紹
    「創作開運禮」Java之使用遞歸進行文件搜索,這次小編要介紹的是過濾器,我們可以使用過濾器來遍歷文件夾以及裡面的子文件夾還有相對應的文件在File類中有兩個和ListFiles重載的方法,方法的參數傳遞的就是過濾器。1.File[] listFiles(FileFilter filter)java.io.FileFilter接口:用於抽象路徑名(File對象)的過濾器。
  • C++、java 和 C 的區別
    的區分 ,這個跟java和c# 的區別比較大,但c#裡面有unit ulong ushort 這三種就相當於c++的修飾詞unsigned,當c++李明的變量類型定義unsigned,就默認是整數。2.java和c#裡面都有字符串型 和byte型, 但c++裡面沒有,但它是以另外的形式存儲這類型的數據的,比如 java和c#裡面的 byte其實就是unsigned char類型;c++中字符數組就能存儲字符串 (char a[]={"hello"}; ps:注意c++裡面定義數組 變量必須在中括號前面)。
  • 「JAVA」屬性、路徑分隔符有何不同?file對象創建,文件過濾器
    路徑分隔符相鄰層級目錄間或目錄與文件間的分隔符,在Unix系系統中,文件路徑分隔符用「/」表示;在Windows系統中,文件路徑分隔符用「\」表示,比如:C:\Java\bin\java.exe在上述路徑中,路徑分隔符是「\」;不同的作業系統會使用不同的文件路徑,不同的文件路徑中會使用不同的路徑分隔符,也會有不同的屬性分隔符,比如:
  • 2020年最新Java學習路線圖,剛入門編程行業的小白必備知識清單!
    圖中涉及到的主要知識如下:java基礎語法-【重點知識】-剛開始學的時候可能會不適應,多敲敲代碼就好了面向對象編程-【重點知識】-在java的世界裡萬物皆對象。>異常-【重點知識】-寫代碼無法避免的存在,務必掌握網絡編程-【最好掌握】-一般公司用的比較少,涉及通信用的會較多除了以上的知識點,在java基礎中還有可視化界面編程,可以開發桌面應用程式,這一部分知識在企業中基本無應用場景,大家也就不要把寶貴的時間浪費在這一塊的,掌握以上知識
  • Java和C/C++的區別是什麼?java高級程式設計師的未來發展是怎樣的?
    中國網際網路科技越來越發達,技術人員成了網際網路科技的驅動先鋒,不僅是C/C++類的從業人員,連java類的從業人員也變得越來越多。據大數據獵頭了解,在科技當道的時代,技術是實現科技發達的主導者,為此,我們來了解一下java高級程式設計師和C/C++有什麼區別?
  • Java中的Filter過濾器詳解
    根據需要檢查 HttpServletRequest ,也可以修改HttpServletRequest 頭和數據。 在HttpServletResponse 到達客戶端之前,攔截HttpServletResponse 。根據需要檢查 HttpServletResponse ,也可以修改HttpServletResponse頭和數據。
  • 新手編程:Java多線程中Thread與Runnable的區別
    Java多線程中Thread與Runnable的區別定義extends Thread子類繼承Thread具備多線程能力,可以實現多線程;啟動線程的方法:①創建子類對象 ②對象名.start();不建議使用:避免多線程OOP單繼承的局限性(OOP:Object Oriented Programming,面向對象的編程、類似的還有OOD
  • 軟體程式語言這麼多,為什麼淄博小夥伴選擇Java呢
    不難發現,在網際網路+的影響下,這幾年,中國的網際網路行業進入了高速發展的階段,同時IT行業,也成為了熱門,備受追捧和關注的行業。在全球雲計算和移動網際網路的產業環境下,Java工程師為何會如此火爆。
  • Java 8 Map,Filter和Collect示例
    它也是一個中間Stream操作,這意味著您可以調用其他Stream方法,如過濾器,或者在此處收集以創建一系列轉換。現在,來進入過濾方法,它會根據您給出的條件過濾元素。例如,如果列表包含數字而您只需要偶數,則可以使用過濾方法僅選擇可完全被2整除的數字。
  • java基礎之一:認識程序和java
    程序的概念:指令集合程式語言:寫程序的工具java:程式語言中的一種,簡單好學,功能強大。。。如何開發java安裝jdk,通過記事本編寫,然後進入DOS控制臺,用javac編譯,java執行。。。算了吧,還是用IDE工具比如eclipse/myeclipse,或者idea,自帶jdk我們編寫的不是程序,是源程序,會經過「替換」成程序,這個過程叫編譯;編譯後的叫程序。。。
  • 詳解Java網絡編程
    埠和套接字當網絡中的兩臺計算機進行通信時,除了確定計算機在網絡中的IP外,還需要確定計算機中的一個埠,埠並不是實際的物理設備,它是一個應用程式,這個應用程式來負責兩臺計算機的通信。一個IP標識了一臺主機(伺服器),主機可以提供多種服務,如web服務、ftp服務、遠程桌面等。主機的每個服務都會等待客戶端的連接,客戶端如何區別這些服務呢?
  • 跟我學java編程—Java字符串類型
    字符串是有限個字符的有序集合,前面講的char類型用於表示和存儲單個字符,字符串相當於幾個或多個char類型的有序集合,用於表示和存儲多個有序的字符序列。例如:「I want to learn Java programming」、「我要學Java編程」、「3+5=8」、「abc」等等。
  • 「零基礎學JAVA」基礎篇 第二章 JAVA編程初體驗
    JAVA【零基礎學編程】系列今天給大家帶來基礎篇 第二章 JAVA編程初體驗本節的部分編碼操作需要先安裝JDK開發工具「零基礎學JAVA」工具篇 JDK的安裝教程(WINDOWS版)和環境變量的配置「零基礎學JAVA」工具篇
  • 為什麼函數式編程在Java中很危險?
    但奇怪的是,我和我的同事並沒有為Haskell、Scheme、Lisp、Clojure、Scala而編程,這個行業裡的絕大部分人都會使用Python、 Ruby、Java或C#等編程,因為它們用起來比較順手。但在Java中,函數式編程卻是低效且危險的。
  • Java socket編程
    而TCP層則提供面向應用的可靠(tcp)的或非可靠(UDP)的數據傳輸機制,這是網絡編程的主要對象,一般不需要關心IP層是如何處理數據的。目前較為流行的網絡編程模型是客戶機/伺服器(C/S)結構。即通信雙方一方作為伺服器等待客戶提出請求並予以響應。客戶則在需要服務時向伺服器提 出申請。