日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
filter、interceptor、aspect應(yīng)如何選擇?很多人中招

 前言

小伙伴們應(yīng)該聽(tīng)說(shuō)過(guò)過(guò)濾器、攔截器、切面,印象上都能夠起到截?cái)鄶r截的作用,在做一些業(yè)務(wù)需求時(shí),不知道如何選擇,今天老顧就來(lái)介紹一下他們之間的區(qū)別。

成都創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、網(wǎng)站建設(shè)與策劃設(shè)計(jì),塔城網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:塔城等地區(qū)。塔城做網(wǎng)站價(jià)格咨詢:028-86922220

Filter過(guò)濾器

過(guò)濾器可以攔截到方法的請(qǐng)求和響應(yīng)(ServletRequest request, ServletResponse response),并對(duì)請(qǐng)求響應(yīng)做出過(guò)濾操作。

過(guò)濾器依賴于servlet容器。在實(shí)現(xiàn)上,基于函數(shù)回調(diào),它可以對(duì)幾乎所有請(qǐng)求進(jìn)行過(guò)濾,一個(gè)過(guò)濾器實(shí)例只能在容器初始化時(shí)調(diào)用一次。

使用過(guò)濾器的目的是用來(lái)做一些過(guò)濾操作,獲取我們想要獲取的數(shù)據(jù),比如:在過(guò)濾器中修改字符編碼;在過(guò)濾器中修改HttpServletRequest的一些參數(shù),包括:過(guò)濾低俗文字、危險(xiǎn)字符等。

話不多說(shuō),先上代碼

再定義兩個(gè)Controller,一個(gè)UserController,一個(gè)OrderController

雖然Filter過(guò)濾器和Controller請(qǐng)求都已經(jīng)定義了,但現(xiàn)在過(guò)濾器是不起作用的。需要把Filter配置一下,有兩個(gè)方案

第一個(gè)方案在Filter上面加上@Component

 
 
 
  1. @Component 
  2. public class TimeFilter implements Filter 

第二個(gè)方案配置化注冊(cè)過(guò)濾器

第二個(gè)方案的特點(diǎn)就是可以細(xì)化到過(guò)濾哪些規(guī)則的URL

我們來(lái)啟動(dòng)應(yīng)用時(shí),過(guò)濾器被初始化了,init函數(shù)被回調(diào)。

請(qǐng)求http://localhost:9000/order/1

看看控制臺(tái)的日志輸出

請(qǐng)求http://localhost:9000/user/1

控制臺(tái)日志輸出

停止應(yīng)用后,控制臺(tái)輸出

Filter隨web應(yīng)用的啟動(dòng)而啟動(dòng),只初始化一次,隨web應(yīng)用的停止而銷毀。

1.啟動(dòng)服務(wù)器時(shí)加載過(guò)濾器的實(shí)例,并調(diào)用init()方法來(lái)初始化實(shí)例;

2.每一次請(qǐng)求時(shí)都只調(diào)用方法doFilter()進(jìn)行處理;

3.停止服務(wù)器時(shí)調(diào)用destroy()方法,銷毀實(shí)例。

我們?cè)賮?lái)看看doFilter方法

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

從參數(shù)我們看到,filter里面是能夠獲取到請(qǐng)求的參數(shù)和響應(yīng)的數(shù)據(jù);但此方法是無(wú)法知道是哪一個(gè)Controller類中的哪個(gè)方法被執(zhí)行。

還有一點(diǎn)需要注意的是,filter中是沒(méi)法使用注入的bean的,也就是無(wú)法使用@Autowired

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

其實(shí)Spring中,web應(yīng)用啟動(dòng)的順序是:listener->filter->servlet,先初始化listener,然后再來(lái)就filter的初始化,再接著才到我們的dispathServlet的初始化,因此,當(dāng)我們需要在filter里注入一個(gè)注解的bean時(shí),就會(huì)注入失敗,因?yàn)閒ilter初始化時(shí),注解的bean還沒(méi)初始化,沒(méi)法注入。

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

Interceptor攔截器

依賴于web框架,在SpringMVC中就是依賴于SpringMVC框架。在實(shí)現(xiàn)上,基于Java的反射機(jī)制,屬于面向切面編程(AOP)的一種運(yùn)用,就是在一個(gè)方法前,調(diào)用一個(gè)方法,或者在方法后,調(diào)用一個(gè)方法。

在WebMvcConfigurationSupport配置一下

執(zhí)行結(jié)果

我們發(fā)現(xiàn)攔截器中可以獲取到Controller對(duì)象

preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

object handler就是controller方法對(duì)象

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

但我們發(fā)現(xiàn)獲取不到方法的參數(shù)值,這個(gè)是為什么呢?在DispatcherServlet類中,方法

doDispatch(HttpServletRequest request, HttpServletResponse response)

applyPreHandle這個(gè)方法執(zhí)行,就是執(zhí)行的攔截器的preHandler方法,但這個(gè)過(guò)程中,controller方法沒(méi)有從request中獲取請(qǐng)求參數(shù),組裝方法參數(shù);而是在ha.handle這個(gè)方法的時(shí)候,才會(huì)組裝參數(shù)

雖然沒(méi)法得到方法的參數(shù),但是可以獲得IOC的bean哦。

再說(shuō)明一點(diǎn)的是postHandler方法

postHandler方法的執(zhí)行,當(dāng)controller內(nèi)部有異常,posthandler方法是不會(huì)執(zhí)行的。

afterCompletion方法,不管controller內(nèi)部是否有異常,都會(huì)執(zhí)行此方法;此方法還會(huì)有個(gè)Exception ex這個(gè)參數(shù);如果有異常,ex會(huì)有異常值;沒(méi)有異常 此值為null

注意點(diǎn)如果controller內(nèi)部有異常,但異常被@ControllerAdvice 異常統(tǒng)一捕獲的話,ex也會(huì)為null

Aspect切片

AOP操作可以對(duì)操作進(jìn)行橫向的攔截,最大的優(yōu)勢(shì)在于他可以獲取執(zhí)行方法的參數(shù),對(duì)方法進(jìn)行統(tǒng)一的處理。常見(jiàn)使用日志,事務(wù),請(qǐng)求參數(shù)安全驗(yàn)證

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

雖然切面aop可以拿到方法參數(shù),但拿不到response,request對(duì)象。

總結(jié)

我們這里來(lái)總結(jié)一下過(guò)濾器、攔截器、Aspect,看看區(qū)別

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

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

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

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

用一個(gè)圖描述一下執(zhí)行順序

小伙伴們可以根據(jù)自身業(yè)務(wù),和上面技術(shù)的各自特點(diǎn),去選擇相應(yīng)的技術(shù)。今天老顧就介紹到這里,謝謝?。?!


網(wǎng)頁(yè)題目:filter、interceptor、aspect應(yīng)如何選擇?很多人中招
本文路徑:http://www.dlmjj.cn/article/cojddsh.html