前言
上一篇中,我們?cè)谶^(guò)濾器、攔截器中,結(jié)合 Redis 加入冪等性校驗(yàn)功能;
在最后的時(shí)候,留下了一個(gè)問(wèn)題,就是為什么這樣做,而不用AOP ?
今天我們就來(lái)探討下。
過(guò)濾器
過(guò)濾器可以攔截到方法的請(qǐng)求和響應(yīng)(ServletRequest request, ServletResponse response),并對(duì)請(qǐng)求響應(yīng)做出過(guò)濾操作;
過(guò)濾器依賴(lài)于servlet容器。在實(shí)現(xiàn)上,基于函數(shù)回調(diào),它可以對(duì)幾乎所有請(qǐng)求進(jìn)行過(guò)濾,一個(gè)過(guò)濾器實(shí)例只能在容器初始化時(shí)調(diào)用一次;
使用Filter完整的流程是:Filter對(duì)用戶(hù)請(qǐng)求進(jìn)行預(yù)處理,接著將請(qǐng)求交給Servlet進(jìn)行預(yù)處理并生成響應(yīng),最后Filter再對(duì)服務(wù)器響應(yīng)進(jìn)行后處理;
過(guò)濾器的作用(摘自JavaDoc)
Examples that have been identified for this design are
- Authentication Filters, 即用戶(hù)訪問(wèn)權(quán)限過(guò)濾
- Logging and Auditing Filters, 日志過(guò)濾,可以記錄特殊用戶(hù)的特殊請(qǐng)求的記錄等
- Image conversion Filters
- Data compression Filters
- Encryption Filters
- Tokenizing Filters
- Filters that trigger resource access events
- XSL/T filters
- Mime-type chain Filter
攔截器
攔截器,在AOP(Aspect-Oriented Programming)中用于在某個(gè)方法或字段被訪問(wèn)之前,進(jìn)行攔截,然后在之前或之后加入某些操作;
攔截器的作用
日志記錄:記錄請(qǐng)求信息的日志,以便進(jìn)行信息監(jiān)控、信息統(tǒng)計(jì)、計(jì)算PV(Page View)等
權(quán)限檢查:如登錄檢測(cè),進(jìn)入處理器檢測(cè)檢測(cè)是否登錄
性能監(jiān)控:通過(guò)攔截器在進(jìn)入處理器之前記錄開(kāi)始時(shí)間,在處理完后記錄結(jié)束時(shí)間,從而得到該請(qǐng)求的處理時(shí)間。(反向代理,如apache也可以自動(dòng)記錄);
通用行為:讀取cookie得到用戶(hù)信息并將用戶(hù)對(duì)象放入請(qǐng)求,從而方便后續(xù)流程使用,還有如提取Locale、Theme信息等,只要是多個(gè)處理器都需要的即可使用攔截器實(shí)現(xiàn)
切面
相比過(guò)濾器,攔截器能夠知道用戶(hù)發(fā)出的請(qǐng)求最終被哪個(gè)控制器處理,但是攔截器還有一個(gè)明顯的不足,即不能夠獲取request的參數(shù)以及控制器處理之后的response,所以就有了切片的用武之地了;
過(guò)濾器、攔截器以及切片的調(diào)用順序
Filter->Intercepto->Aspect->Controller
過(guò)濾器和攔截器的區(qū)別
| Filter | Interceptor | |
|---|---|---|
| 實(shí)現(xiàn)方式 | 過(guò)濾器是基于函數(shù)回調(diào) | 基于Java的反射機(jī)制的 |
| 規(guī)范 | Servlet規(guī)范 | Spring規(guī)范 |
| 作用范圍 | 對(duì)幾乎所有的請(qǐng)求起作用 | 只對(duì)action請(qǐng)求起作用 |