日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Java高頻面試題:過濾器和攔截器兩位難兄難弟區(qū)別

來源: 責(zé)編: 時間:2024-01-17 10:13:25 227觀看
導(dǎo)讀一、前言一直想著寫一篇關(guān)于過濾器和攔截器,記得之前面試,面試官突然問了一個談?wù)勥^濾器和攔截器的區(qū)別。當(dāng)時腦瓜子嗡嗡的,這個沒準(zhǔn)備過,咋辦,支支吾吾的說了先到過濾器在到攔截器。直接被說,你連請求來了經(jīng)歷那些都不知道

yso28資訊網(wǎng)——每日最新資訊28at.com

一、前言

一直想著寫一篇關(guān)于過濾器和攔截器,記得之前面試,面試官突然問了一個談?wù)勥^濾器和攔截器的區(qū)別。yso28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)時腦瓜子嗡嗡的,這個沒準(zhǔn)備過,咋辦,支支吾吾的說了先到過濾器在到攔截器。yso28資訊網(wǎng)——每日最新資訊28at.com

直接被說,你連請求來了經(jīng)歷那些都不知道,怎么能行呢?yso28資訊網(wǎng)——每日最新資訊28at.com

雖然這個是八股文,但是還是比較有內(nèi)容的,在項(xiàng)目中會使用到,在鑒權(quán)、日志記錄等!yso28資訊網(wǎng)——每日最新資訊28at.com

從此之后,面試前第一件事,就是把過濾器和攔截器看一遍。yso28資訊網(wǎng)——每日最新資訊28at.com

今天好好總結(jié)一下,不需要在看別人寫的了!yso28資訊網(wǎng)——每日最新資訊28at.com

不能為了面試而學(xué)習(xí),咱們是為了掌握好他們,咱們今天從概念--->場景--->實(shí)戰(zhàn)--->面試題。yso28資訊網(wǎng)——每日最新資訊28at.com

一步步層層遞進(jìn),不讓大家白白點(diǎn)開,一定是有所收獲!yso28資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行順序總體圖:yso28資訊網(wǎng)——每日最新資訊28at.com

yso28資訊網(wǎng)——每日最新資訊28at.com

二、過濾器

1、概念

過濾器是一種在 Java Web 應(yīng)用中用于處理請求和響應(yīng)的組件。它可以攔截客戶端發(fā)起的請求,也可以攔截服務(wù)器返回的響應(yīng),對它們進(jìn)行處理或者修改。yso28資訊網(wǎng)——每日最新資訊28at.com

過濾器屬于Servlet規(guī)范的一部分,過濾器是用于執(zhí)行過濾任務(wù)的對象,它可以在請求到達(dá) Servlet 之前或響應(yīng)發(fā)送給客戶端之前執(zhí)行一些額外的邏輯。yso28資訊網(wǎng)——每日最新資訊28at.com

2、應(yīng)用場景

日志記錄: 過濾器常用于記錄請求和響應(yīng)的日志,包括請求的路徑、參數(shù)、處理時間等信息。yso28資訊網(wǎng)——每日最新資訊28at.com

身份驗(yàn)證和授權(quán): 過濾器可以用于實(shí)現(xiàn)身份驗(yàn)證和授權(quán)邏輯,例如檢查用戶是否已登錄,是否具有足夠的權(quán)限訪問某個資源。yso28資訊網(wǎng)——每日最新資訊28at.com

防御性編程: 過濾器可以用于對請求進(jìn)行安全檢查,防止?jié)撛诘墓簦热缱柚箰阂庹埱蟆SS(跨站腳本攻擊)等。yso28資訊網(wǎng)——每日最新資訊28at.com

性能監(jiān)控: 過濾器可以用于收集請求的處理時間、資源使用等信息,用于性能監(jiān)控和優(yōu)化。yso28資訊網(wǎng)——每日最新資訊28at.com

3、核心方法

先說一下過濾器的三個核心方法:init 方法:在過濾器被創(chuàng)建并添加到容器時調(diào)用,在過濾器的生命周期中只被調(diào)用一次。doFilter 方法:是過濾器的核心方法,用于處理請求和響應(yīng)。可以進(jìn)行前置處理、請求轉(zhuǎn)發(fā)或鏈的調(diào)用,以及后置處理。(FilterChain.doFilter)destroy 方法:在過濾器被銷毀前調(diào)用,用于進(jìn)行資源釋放和清理工作。在過濾器的生命周期中只被調(diào)用一次。yso28資訊網(wǎng)——每日最新資訊28at.com

4、實(shí)戰(zhàn)

編寫自己的過濾器配置類: 會把web開頭的請求率先通過我們定義的過濾器,我們可以在里面進(jìn)行權(quán)限的校驗(yàn)、記錄日志等。yso28資訊網(wǎng)——每日最新資訊28at.com

多個過濾器,需要有執(zhí)行順序可以使用Spring注解@Order,也可以使用@WebFilter(urlPatterns="/web/order/"),通過請求去到下一個符合條件的過濾器!yso28資訊網(wǎng)——每日最新資訊28at.com

咱們使用的注解,需要在啟動類加上掃描,不然過濾器是不會生效的!yso28資訊網(wǎng)——每日最新資訊28at.com

@ServletComponentScan。yso28資訊網(wǎng)——每日最新資訊28at.com

/** * @author wangzhenjun * @date 2023/11/22 15:34 */@Slf4j@WebFilter("/web/*")public class MyFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        Filter.super.init(filterConfig);    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        log.info("用戶已經(jīng)認(rèn)證,繼續(xù)處理");        log.info("用戶有權(quán)限,繼續(xù)處理");        chain.doFilter(request, response);        log.info("處理完成,放行之后");    }    @Override    public void destroy() {        Filter.super.destroy();    }}

測試訪問,經(jīng)過了過濾器,來到我們的Controller,最后重新會到過濾器內(nèi)的doFilter方法!yso28資訊網(wǎng)——每日最新資訊28at.com

yso28資訊網(wǎng)——每日最新資訊28at.com

三、攔截器

1、概念

攔截器(Interceptor)是一種在應(yīng)用程序處理請求和響應(yīng)的過程中,插入自定義處理邏輯的組件。攔截器是一種常見的設(shè)計(jì)模式,它允許在核心處理邏輯之前或之后執(zhí)行額外的操作。yso28資訊網(wǎng)——每日最新資訊28at.com

一般出現(xiàn)在Spring MVC中,Spring MVC 中的攔截器實(shí)現(xiàn)原理主要基于 Spring 框架的 AOP和 HandlerInterceptor 接口。yso28資訊網(wǎng)——每日最新資訊28at.com

2、應(yīng)用場景

敏感字檢測:過濾器可以用于檢測請求中的文本內(nèi)容,包括表單提交、請求參數(shù)等,以查找是否包含敏感字。異常處理: 攔截器可以用于捕獲和處理在請求處理過程中發(fā)生的異常。這使得開發(fā)者可以集中處理異常情況,返回合適的錯誤響應(yīng)或記錄異常信息。日志記錄: 攔截器可用于記錄請求和響應(yīng)的日志信息,包括請求參數(shù)、響應(yīng)狀態(tài)碼、執(zhí)行時間等。國際化和本地化: 攔截器可以用于根據(jù)請求的語言或地區(qū)設(shè)置合適的國際化或本地化信息,以提供多語言支持。yso28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)過濾器和攔截器很多場景他們兩個都能實(shí)現(xiàn)。待會我們說一下區(qū)別在那里,都能實(shí)現(xiàn)一般采用什么方式去實(shí)現(xiàn)!yso28資訊網(wǎng)——每日最新資訊28at.com

3、核心方法

先說一下攔截器接口的三個核心方法:yso28資訊網(wǎng)——每日最新資訊28at.com

preHandle 方法: 在請求被處理之前調(diào)用。該方法在整個請求處理過程中是第一個被調(diào)用的方法。yso28資訊網(wǎng)——每日最新資訊28at.com

如果該方法返回 true,則請求繼續(xù)進(jìn)行后續(xù)的處理;如果返回 false,則中斷請求處理,不會進(jìn)入控制器方法。yso28資訊網(wǎng)——每日最新資訊28at.com

postHandle 方法: 在請求處理后、視圖渲染前調(diào)用。在這個方法中,可以進(jìn)行一些后置處理,如對ModelAndView的修改等。yso28資訊網(wǎng)——每日最新資訊28at.com

afterCompletion方法: 在整個請求完成后調(diào)用,即在視圖渲染完畢或在處理過程中發(fā)生異常后調(diào)用。這個方法在請求完成后,不論請求處理過程中是否發(fā)生異常都會被調(diào)用。yso28資訊網(wǎng)——每日最新資訊28at.com

4、實(shí)戰(zhàn)

先創(chuàng)建自己的攔截器類:MyInterceptor、yso28資訊網(wǎng)——每日最新資訊28at.com

/** * @author wangzhenjun * @date 2023/11/23 9:17 */@Slf4j@Componentpublic class MyInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {        log.info("===>攔截器<===:開始對數(shù)據(jù)進(jìn)行敏感字過濾");        return true;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,                           ModelAndView modelAndView) {        // 在請求處理后、視圖渲染前執(zhí)行的邏輯        log.info("===>攔截器<===:我可以改變一下modelAndView!");    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,                                Exception ex) {        log.info("===>攔截器<===:釋放資源");    }}

把自己的攔截器注冊上:yso28資訊網(wǎng)——每日最新資訊28at.com

/** * @author wangzhenjun * @date 2023/11/23 10:54 */@Configurationpublic class MyWebConfig implements WebMvcConfigurer {    @Autowired    private MyInterceptor myInterceptor;    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(myInterceptor)                .addPathPatterns("/web/*");    }}

測試訪問一下,攔截成功,走了我們自定義的攔截器!yso28資訊網(wǎng)——每日最新資訊28at.com

yso28資訊網(wǎng)——每日最新資訊28at.com

四、面試題:二者有什么區(qū)別?

我們從下面幾種情況來說一下二者的區(qū)別!yso28資訊網(wǎng)——每日最新資訊28at.com

1、出身不同

過濾器: 是基于 Java Servlet 規(guī)范的一部分,屬于 Servlet 容器的一項(xiàng)功能。yso28資訊網(wǎng)——每日最新資訊28at.com

yso28資訊網(wǎng)——每日最新資訊28at.com

攔截器: 是 Spring MVC 框架的一部分,屬于 Spring 框架的一項(xiàng)特性。yso28資訊網(wǎng)——每日最新資訊28at.com

yso28資訊網(wǎng)——每日最新資訊28at.com

2、應(yīng)用場景不同

過濾器: 主要用于全局范圍的請求和響應(yīng)處理,可以對所有請求進(jìn)行通用性的處理,例如性能監(jiān)控、身份驗(yàn)證、日志記錄等。yso28資訊網(wǎng)——每日最新資訊28at.com

攔截器: 主要用于對控制器方法的請求和響應(yīng)進(jìn)行處理,攔截器的配置更加靈活,攔截器更接近業(yè)務(wù)系統(tǒng),可以實(shí)現(xiàn)特定業(yè)務(wù)邏輯的攔截,例如敏感字檢測、異常監(jiān)控等。yso28資訊網(wǎng)——每日最新資訊28at.com

我們把握住側(cè)重點(diǎn)核心是在:yso28資訊網(wǎng)——每日最新資訊28at.com

過濾器:通用性功能攔截器:業(yè)務(wù)邏輯方面。yso28資訊網(wǎng)——每日最新資訊28at.com

3、實(shí)現(xiàn)原理不同

過濾器的底層實(shí)現(xiàn)原理是基于方法回調(diào)實(shí)現(xiàn)的,我們在doFilter方法中看到chain.doFilter(request, response);,這個就是核心,我們看一下他的源碼:yso28資訊網(wǎng)——每日最新資訊28at.com

/*** FilterChain 是 servlet 容器提供給開發(fā)人員的一個對象,用于查看已過濾資源請求的調(diào)用鏈。* 篩選器使用 FilterChain 調(diào)用鏈中的下一個篩選器,或者如果調(diào)用篩選器是鏈中的最后一個篩選器,則調(diào)用鏈末尾的資源。*/public interface FilterChain {    /**     * 導(dǎo)致調(diào)用鏈中的下一個篩選器,或者如果調(diào)用篩選器是鏈中的最后一個篩選器,     * 則會導(dǎo)致調(diào)用鏈末尾的資源。     */    public void doFilter(ServletRequest request, ServletResponse response)            throws IOException, ServletException;}

攔截器的底層實(shí)現(xiàn)原理基于動態(tài)代理(HandlerInterceptor 的代理對象是通過AOP機(jī)制實(shí)現(xiàn)的)和反射機(jī)制實(shí)現(xiàn)的。yso28資訊網(wǎng)——每日最新資訊28at.com

過濾器鏈HandlerExecutionChain類,有興趣的可以看一下!yso28資訊網(wǎng)——每日最新資訊28at.com

yso28資訊網(wǎng)——每日最新資訊28at.com

4、執(zhí)行順序

我們剛剛就在實(shí)戰(zhàn)中看到了執(zhí)行順序:yso28資訊網(wǎng)——每日最新資訊28at.com

yso28資訊網(wǎng)——每日最新資訊28at.com

我們在看一下代碼中的執(zhí)行順序,先執(zhí)行過濾器,在執(zhí)行攔截器,最后才會進(jìn)入真正的要調(diào)用的方法。yso28資訊網(wǎng)——每日最新資訊28at.com

yso28資訊網(wǎng)——每日最新資訊28at.com

五、總結(jié)

看到這里都是成功人士,對于一個面試題,我們不能只背一下,而是從多方面去了解它,這樣才能印象深刻。yso28資訊網(wǎng)——每日最新資訊28at.com

況且,過濾器和攔截器在企業(yè)級應(yīng)用中還是很常見的,特別是攔截器,誰能說自己的項(xiàng)目里沒有使用!yso28資訊網(wǎng)——每日最新資訊28at.com

過濾器側(cè)重通用性,攔截器側(cè)重業(yè)務(wù),更加靈活!yso28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然有些東西,使用AOP,自己定義個注解,來進(jìn)行切面,做一下日志記錄,監(jiān)控啥的也是挺好的。yso28資訊網(wǎng)——每日最新資訊28at.com

大家根據(jù)自己的場景來選擇。yso28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-63226-0.htmlJava高頻面試題:過濾器和攔截器兩位難兄難弟區(qū)別

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 程序開發(fā)中常用的十種算法,你用過幾種?

下一篇: 精準(zhǔn)解析 useLayoutEffect 與 useEffect 的執(zhí)行時機(jī)

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 金华市| 万山特区| 甘孜县| 房山区| 漳浦县| 衡南县| 平凉市| 若尔盖县| 盐亭县| 钟祥市| 侯马市| 武定县| 肇东市| 营山县| 大理市| 双江| 克山县| 东安县| 革吉县| 河西区| 大同县| 寿宁县| 界首市| 莱州市| 嘉祥县| 松阳县| 滁州市| 高平市| 桂林市| 十堰市| 公安县| 青海省| 防城港市| 将乐县| 福海县| 雷州市| 灵寿县| 百色市| 日喀则市| 大城县| 定陶县|