成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

filter、interceptor、aspect應如何選擇?很多人中招

新聞 前端
小伙伴們應該聽說過過濾器、攔截器、切面,印象上都能夠起到截斷攔截的作用,在做一些業務需求時,不知道如何選擇,今天老顧就來介紹一下他們之間的區別。

 前言

小伙伴們應該聽說過過濾器、攔截器、切面,印象上都能夠起到截斷攔截的作用,在做一些業務需求時,不知道如何選擇,今天老顧就來介紹一下他們之間的區別。

Filter過濾器

過濾器可以攔截到方法的請求和響應(ServletRequest request, ServletResponse response),并對請求響應做出過濾操作。

過濾器依賴于servlet容器。在實現上,基于函數回調,它可以對幾乎所有請求進行過濾,一個過濾器實例只能在容器初始化時調用一次。

使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的數據,比如:在過濾器中修改字符編碼;在過濾器中修改HttpServletRequest的一些參數,包括:過濾低俗文字、危險字符等。

話不多說,先上代碼

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

再定義兩個Controller,一個UserController,一個OrderController

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招
阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

雖然Filter過濾器和Controller請求都已經定義了,但現在過濾器是不起作用的。需要把Filter配置一下,有兩個方案

第一個方案在Filter上面加上@Component

  1. @Component 
  2. public class TimeFilter implements Filter 

第二個方案配置化注冊過濾器

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

第二個方案的特點就是可以細化到過濾哪些規則的URL

我們來啟動應用時,過濾器被初始化了,init函數被回調。

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

請求http://localhost:9000/order/1

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

看看控制臺的日志輸出

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

請求http://localhost:9000/user/1

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

控制臺日志輸出

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

停止應用后,控制臺輸出

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

Filter隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。

1.啟動服務器時加載過濾器的實例,并調用init()方法來初始化實例;

2.每一次請求時都只調用方法doFilter()進行處理;

3.停止服務器時調用destroy()方法,銷毀實例。

我們再來看看doFilter方法

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

從參數我們看到,filter里面是能夠獲取到請求的參數和響應的數據;但此方法是無法知道是哪一個Controller類中的哪個方法被執行。

還有一點需要注意的是,filter中是沒法使用注入的bean的,也就是無法使用@Autowired

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

上面代碼注入的值為null。這是為什么呢?

其實Spring中,web應用啟動的順序是:listener->filter->servlet,先初始化listener,然后再來就filter的初始化,再接著才到我們的dispathServlet的初始化,因此,當我們需要在filter里注入一個注解的bean時,就會注入失敗,因為filter初始化時,注解的bean還沒初始化,沒法注入。

如果一定你要使用,需要做一些處理,可以私信老顧哦

Interceptor攔截器

依賴于web框架,在SpringMVC中就是依賴于SpringMVC框架。在實現上,基于Java的反射機制,屬于面向切面編程(AOP)的一種運用,就是在一個方法前,調用一個方法,或者在方法后,調用一個方法。

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

在WebMvcConfigurationSupport配置一下

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

執行結果

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

我們發現攔截器中可以獲取到Controller對象

preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

object handler就是controller方法對象

HandlerMethod handlerMethod = (HandlerMethod)handler;
handlerMethod.getBean().getClass().getName(); //獲取類名
handlerMethod.getMethod().getName(); //獲取方法名

但我們發現獲取不到方法的參數值,這個是為什么呢?在DispatcherServlet類中,方法

doDispatch(HttpServletRequest request, HttpServletResponse response)

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

applyPreHandle這個方法執行,就是執行的攔截器的preHandler方法,但這個過程中,controller方法沒有從request中獲取請求參數,組裝方法參數;而是在ha.handle這個方法的時候,才會組裝參數

雖然沒法得到方法的參數,但是可以獲得IOC的bean哦。

再說明一點的是postHandler方法

postHandler方法的執行,當controller內部有異常,posthandler方法是不會執行的。

afterCompletion方法,不管controller內部是否有異常,都會執行此方法;此方法還會有個Exception ex這個參數;如果有異常,ex會有異常值;沒有異常 此值為null

注意點如果controller內部有異常,但異常被@ControllerAdvice 異常統一捕獲的話,ex也會為null

Aspect切片

AOP操作可以對操作進行橫向的攔截,最大的優勢在于他可以獲取執行方法的參數,對方法進行統一的處理。常見使用日志,事務,請求參數安全驗證

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

上面的代碼中,我們是可以獲取方法的參數的

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

雖然切面aop可以拿到方法參數,但拿不到response,request對象。

總結

我們這里來總結一下過濾器、攔截器、Aspect,看看區別

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

如果三者方式同時采用,那他們的執行順序是什么呢?

filter -> interceptor -> ControllerAdvice -> aspect -> controller

返回值順序,或異常返回順序

controller -> aspect -> controllerAdvice -> Interceptor -> Filter

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

用一個圖描述一下執行順序

阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

小伙伴們可以根據自身業務,和上面技術的各自特點,去選擇相應的技術。今天老顧就介紹到這里,謝謝?。?!

 

 

責任編輯:張燕妮 來源: 頭條科技
相關推薦

2024-09-12 08:32:42

2021-01-30 11:42:53

迭代器代碼元素

2025-06-13 10:14:55

2018-02-13 14:48:17

戴爾

2022-02-06 00:07:19

互聯網失業職業

2019-12-06 09:29:12

瀏覽器HTML編程語言

2022-07-06 10:33:39

技術債務CIO

2017-12-13 15:57:12

2019-12-09 10:02:41

泛型ypeScript前端

2021-06-24 09:08:34

Java代碼泛型

2020-06-29 08:28:36

v-for 解構函數

2014-05-09 15:29:21

2020-11-16 11:24:00

Spring AOP數據庫

2025-02-21 08:48:16

Typescript內置聯合類型

2021-01-15 05:39:13

HashMapHashTableTreeMap

2020-06-08 19:16:52

大數據IT技術

2021-02-22 13:14:00

計算機編程技術

2021-09-21 10:33:56

人工智能科學技術

2022-01-05 23:34:02

顯示器濾藍光LED

2019-08-08 16:00:08

HTTPGETPOST
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品免费播放 | 久久成人精品 | 神马久久久久久久久久 | 一区二区三区电影在线观看 | 中文二区| 亚洲色图第一页 | 欧美日韩网站 | 性在线| 天堂av中文在线 | 狠狠入ady亚洲精品经典电影 | 91影视| 久久er99热精品一区二区 | 精品一区二区三区中文字幕 | 国产日韩欧美综合 | 精品国产鲁一鲁一区二区张丽 | 亚洲国产成人精品女人久久久 | 天天看天天操 | 在线观看中文字幕视频 | 国产精品色av | 免费一区二区在线观看 | 人人擦人人 | 久久久久久久久综合 | 日韩国产一区二区三区 | 亚洲精品成人网 | 亚洲国产成人精品久久 | 欧美13videosex性极品 | 黄视频网站在线 | 日韩黄色小视频 | 日韩一区二区三区在线 | 污视频免费在线观看 | 国产精品久久久久久久7电影 | 亚洲a视频| 极情综合网 | 欧美日韩亚洲国产 | 久久久噜噜噜www成人网 | 日韩精品一区二区三区四区视频 | 欧美aaa一级片 | 精品一区二区三区中文字幕 | 国产女人叫床高潮大片免费 | 久久久国产一区二区 | 日韩精品视频一区二区三区 |