精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot攔截器和動態代理有什么區別?

開發 前端
在 Spring Boot 中,攔截器和動態代理都是用來實現功能增強的,但二者沒有任何關聯關系,它的區別主要體現在使用范圍、實現原理、加入時機和使用的難易程度都是不同的。

在 Spring Boot 中,攔截器和動態代理都是用來實現功能增強的,所以在很多時候,有人會認為攔截器的底層是通過動態代理實現的,所以本文就來盤點一下他們兩的區別,以及攔截器的底層實現。

1、攔截器

攔截器(Interceptor)準確來說在 Spring MVC 中的一個很重要的組件,用于攔截 Controller 的請求。它的主要作用有以下幾個:

  • 權限驗證:驗證用戶是否登錄、是否有權限訪問某個接口。
  • 日志記錄:記錄請求信息的日志,如請求參數,響應信息等。
  • 性能監控:監控系統的運行性能,如慢查詢接口等。
  • 通用行為:插入一些通用的行為,比如開發環境忽略某些請求。

典型的使用場景是身份認證、授權檢查、請求日志記錄等。

(1)攔截器實現

在 Spring Boot 中攔截器的實現分為兩步:

  • 創建一個普通的攔截器,實現 HandlerInterceptor 接口,并重寫接口中的相關方法。
  • 將上一步創建的攔截器加入到 Spring Boot 的配置文件中,并配置攔截規則。

具體實現如下。

實現自定義攔截器

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class TestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("攔截器:執行 preHandle 方法。");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("攔截器:執行 postHandle 方法。");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("攔截器:執行 afterCompletion 方法。");
    }
}

其中:

  • boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):在請求方法執行前被調用,也就是調用目標方法之前被調用。比如我們在操作數據之前先要驗證用戶的登錄信息,就可以在此方法中實現,如果驗證成功則返回 true,繼續執行數據操作業務;否則就返回 false,后續操作數據的業務就不會被執行了。
  • void postHandle(HttpServletRequest request, HttpServletResponse response, Object handle,ModelAndView modelAndView):調用請求方法之后執行,但它會在 DispatcherServlet 進行渲染視圖之前被執行。
  • void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):會在整個請求結束之后再執行,也就是在 DispatcherServlet 渲染了對應的視圖之后再執行。

配置攔截規則

然后,我們再將上面的攔截器注入到項目配置文件中,并設置相應攔截規則,具體實現代碼如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AppConfig implements WebMvcConfigurer {

    // 注入攔截器
    @Autowired
    private TestInterceptor testInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(testInterceptor) // 添加攔截器
                .addPathPatterns("/**"); // 攔截所有地址
          .excludePathPatterns("/login"); // 放行接口
    }
}

這樣我們的攔截器就實現完了。

(2)攔截器實現原理

Spring Boot 攔截器是基于 Java 的 Servlet 規范實現的,通過實現 HandlerInterceptor 接口來實現攔截器功能。

在 Spring Boot 框架的執行流程中,攔截器被注冊在 DispatcherServlet 的 doDispatch() 方法中,該方法是 Spring Boot 框架的核心方法,用于處理請求和響應。

程序每次執行時都會調用 doDispatch() 方法時,并驗證攔截器(鏈),之后再根據攔截器返回的結果,進行下一步的處理。如果返回的是 true,那么繼續調用目標方法,反之則會直接返回驗證失敗給前端。

doDispatch  源碼實現如下:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

    try {
        try {
            ModelAndView mv = null;
            Object dispatchException = null;

            try {
                processedRequest = this.checkMultipart(request);
                multipartRequestParsed = processedRequest != request;
                mappedHandler = this.getHandler(processedRequest);
                if (mappedHandler == null) {
                    this.noHandlerFound(processedRequest, response);
                    return;
                }

                HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
                String method = request.getMethod();
                boolean isGet = HttpMethod.GET.matches(method);
                if (isGet || HttpMethod.HEAD.matches(method)) {
                    long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                    if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
                        return;
                    }
                }

                // 調用預處理【重點】
                if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                    return;
                }

                // 執行 Controller 中的業務
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
                if (asyncManager.isConcurrentHandlingStarted()) {
                    return;
                }

                this.applyDefaultViewName(processedRequest, mv);
                mappedHandler.applyPostHandle(processedRequest, response, mv);
            } catch (Exception var20) {
                dispatchException = var20;
            } catch (Throwable var21) {
                dispatchException = new NestedServletException("Handler dispatch failed", var21);
            }

            this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
        } catch (Exception var22) {
            this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);
        } catch (Throwable var23) {
            this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", var23));
        }

    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else if (multipartRequestParsed) {
            this.cleanupMultipart(processedRequest);
        }

    }
}

從上述源碼可以看出在開始執行 Controller 之前,會先調用 預處理方法 applyPreHandle,而 applyPreHandle 方法的實現源碼如下:

boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
    for(int i = 0; i < this.interceptorList.size(); this.interceptorIndex = i++) {
        // 獲取項目中使用的攔截器 HandlerInterceptor
        HandlerInterceptor interceptor = (HandlerInterceptor)this.interceptorList.get(i);
        if (!interceptor.preHandle(request, response, this.handler)) {
            this.triggerAfterCompletion(request, response, (Exception)null);
            return false;
        }
    }
    return true;
}

從上述源碼可以看出,在 applyPreHandle 中會獲取所有的攔截器 HandlerInterceptor 并執行攔截器中的 preHandle 方法,這樣就會咱們前面定義的攔截器對應上了,如下圖所示:

此時用戶登錄權限的驗證方法就會執行,這就是攔截器的執行過程。因此,可以得出結論,攔截器的實現主要是依賴 Servlet 或 Spring 執行流程來進行攔截和功能增強的。

2、動態代理

動態代理是一種設計模式,它是指在運行時提供代理對象,來擴展目標對象的功能。在 Spring 中的,動態代理的實現手段有以下兩種:

  • JDK 動態代理:通過反射機制生成代理對象,目標對象必須實現接口。
  • CGLIB 動態代理:通過生成目標類的子類來實現代理,不要求目標對象實現接口。

動態代理的主要作用包括:

  • 擴展目標對象的功能:如添加日志、驗證參數等。
  • 控制目標對象的訪問:如進行權限控制。
  • 延遲加載目標對象:在需要時才實例化目標對象。
  • 遠程代理:將請求轉發到遠程的目標對象上。

JDK 動態代理和 CGLIB 的區別詳見:www.javacn.site/interview/spring/jdk_cglib.html

3、攔截器 VS 動態代理

因此,我們可以得出結論,攔截器和動態代理雖然都是用來實現功能增強的,但二者完全不同,他們的主要區別體現在以下幾點:

  • 使用范圍不同:攔截器通常用于 Spring MVC 中,主要用于攔截 Controller 請求。動態代理可以使用在 Bean 中,主要用于提供 bean 的代理對象,實現對 bean 方法的攔截。
  • 實現原理不同:攔截器是通過 HandlerInterceptor 接口來實現的,主要是通過 afterCompletion、postHandle、preHandle 這三個方法在請求前后進行攔截處理。動態代理主要有 JDK 動態代理和 CGLIB 動態代理,JDK 通過反射生成代理類;CGLIB 通過生成被代理類的子類來實現代理。
  • 加入時機不同:攔截器是在運行階段動態加入的;動態代理是在編譯期或運行期生成的代理類。
  • 使用難易程度不同:攔截器相對簡單,通過實現接口即可使用。動態代理稍微復雜,需要了解動態代理的實現原理,然后通過相應的 api 實現。

小結

在 Spring Boot 中,攔截器和動態代理都是用來實現功能增強的,但二者沒有任何關聯關系,它的區別主要體現在使用范圍、實現原理、加入時機和使用的難易程度都是不同的。

責任編輯:姜華 來源: Java中文社群
相關推薦

2023-02-20 07:19:14

2023-05-29 07:36:04

Java過濾器攔截器

2020-07-20 09:18:43

存儲數據技術

2009-02-12 15:33:00

代理服務器HTTPSOCKS

2021-05-16 14:26:08

RPAIPACIO

2024-05-27 00:40:00

2024-09-09 13:10:14

2022-02-27 15:33:22

安全CASBSASE

2021-12-17 14:40:02

while(1)for(;;)語言

2024-03-05 18:59:59

前端開發localhost

2022-08-02 08:23:37

SessionCookies

2022-09-08 18:38:26

LinuxWindowsmacOS

2020-11-09 14:07:53

PyQtQt編程

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-07 18:32:57

并發編程線程

2022-06-06 14:53:02

LoRaLoRaWAN

2025-05-09 08:20:50

2025-03-10 09:30:00

SpringJava開發

2023-12-15 09:21:17

ObjectJavaString
點贊
收藏

51CTO技術棧公眾號

久久久久久不卡| 色哟哟视频在线| 男人的天堂在线视频免费观看| 国产在线播精品第三| 国内精品久久久久久中文字幕| 中文字幕狠狠干| 日韩一级特黄| 欧美日韩激情美女| 国产av第一区| 韩国福利在线| 成人精品视频一区二区三区尤物| 国产成人一区二| 久久综合色综合| 日韩精品免费| 亚洲精品久久久久中文字幕二区| 亚洲污视频在线观看| 91九色美女在线视频| 国产精品丝袜91| 久久久久久久久四区三区| 国产又粗又长又黄| 久久在线精品| 欧美成人激情视频免费观看| x88av在线| 欧美交a欧美精品喷水| 91精品国产品国语在线不卡| 粉嫩虎白女毛片人体| av影院在线| 亚洲精品ww久久久久久p站| 亚洲国产一区二区三区在线| 亚洲 欧美 自拍偷拍| 国产精品69毛片高清亚洲| 国产精品久久久久久久久| 97免费在线观看视频| 亚洲欧美一级二级三级| xxav国产精品美女主播| 国产精品免费无码| 最新亚洲精品| 日韩精品中文字幕久久臀| 日本中文字幕有码| 久久久久久久久成人| 欧美日本一道本在线视频| 国产第一页视频| 成人福利av| 精品久久久久久久久久国产 | 亚洲激情成人| 欧美高清一级大片| www青青草原| 亚洲一区色图| 久久综合免费视频| 91高清免费观看| 2023国产精品久久久精品双| 中文字幕在线亚洲| 精品视频第一页| 欧美在线电影| 最新亚洲国产精品| 欧美xxxooo| 888久久久| 久久精品国产69国产精品亚洲| 永久免费看片直接| 亚洲国产一区二区在线观看| 久久精品中文字幕电影| 亚洲综合视频网站| 狠色狠色综合久久| 97色伦亚洲国产| 日本高清www免费视频| 性欧美精品高清| 日韩av免费在线| 中文字幕日产av| 激情综合网天天干| 91精品综合久久| 天天色综合久久| 久久嫩草精品久久久精品一| 欧美久久久久久久| 福利片在线观看| 综合激情成人伊人| 久久99中文字幕| 另类专区亚洲| 欧美日韩黄视频| 337p日本欧洲亚洲大胆张筱雨| 国产96在线亚洲| 亚洲精品日韩欧美| 肉色超薄丝袜脚交69xx图片| 欧美视频导航| 日产精品99久久久久久| 中文字幕欧美人妻精品| 国产精品888| 欧美精品二区三区四区免费看视频| eeuss影院在线播放| 一区二区在线电影| 亚洲人成无码www久久久| 午夜不卡一区| 日韩大陆欧美高清视频区| 日本午夜精品视频| 18成人免费观看视频| 国产精品久久久久久久天堂| 国产一区二区在线播放视频| 成人国产精品视频| 亚洲欧美国产一区二区| 黄网av在线| 欧美日韩国产一级片| 性感美女一区二区三区| 精品国产aⅴ| 国产69精品久久久久9| 伊人久久亚洲综合| 97久久精品人人澡人人爽| 中文网丁香综合网| 周于希免费高清在线观看| 欧美一区二区不卡视频| 精品欧美一区二区久久久| 黑人一区二区| 91青草视频久久| 国产一区二区影视| 午夜视黄欧洲亚洲| 国产传媒免费观看| 欧美日一区二区| 午夜精品一区二区三区在线 | 亚洲一区影院| 中文字幕在线视频网站| 日韩精品专区在线| 91ts人妖另类精品系列| 老司机一区二区三区| 国产精品 日韩| 九七久久人人| 欧美三级电影精品| 色欲狠狠躁天天躁无码中文字幕 | 五月精品视频| 国产国语刺激对白av不卡| 人妻妺妺窝人体色www聚色窝| 18成人在线视频| 日韩中文字幕a| 欧美日韩水蜜桃| 日韩美女福利视频| 天堂在线免费av| 亚洲欧美经典视频| 中文字幕一区二区三区四| 日韩欧美二区| 国产精品你懂得| 黄上黄在线观看| 欧美视频中文字幕在线| xxxx黄色片| 国产亚洲高清视频| 九色综合日本| 欧美日韩在线观看首页| 日韩激情视频在线播放| 五月婷婷激情网| 99在线精品观看| 欧美在线一区视频| 另类尿喷潮videofree| 97视频在线观看网址| 日韩一级免费毛片| 欧美性xxxxhd| 日本人亚洲人jjzzjjz| 日本网站在线观看一区二区三区| 日韩av在线电影观看| 91精品影视| 中文字幕免费精品一区高清| 91激情在线观看| 亚洲欧美电影院| 中文字幕乱妇无码av在线| 国产精品v一区二区三区| 成人区精品一区二区| 麻豆mv在线观看| 亚洲天堂开心观看| 国产一级精品毛片| 亚洲天堂av老司机| 蜜臀av粉嫩av懂色av| aa亚洲婷婷| 午夜精品视频在线观看一区二区| 国产一区二区主播在线| 久久视频在线直播| 人妻精品一区一区三区蜜桃91| 精品二区三区线观看| 国产精品一二三区在线观看| 裸体在线国模精品偷拍| 国产一级片91| 极品束缚调教一区二区网站| 日本久久久a级免费| 天堂资源在线中文| 精品国产伦一区二区三区观看方式 | 15—17女人毛片| 欧美日韩三区| 欧美另类视频在线| 精品中文视频| 国产成人精品一区二区在线| 国产在线69| 日韩大陆欧美高清视频区| 在线观看xxxx| 红桃av永久久久| 日韩av网站在线播放| 成人高清免费观看| 亚洲黄色av网址| 在线播放日韩| 亚洲不卡1区| 欧美大片91| 国产91精品在线播放| 欧美人与动牲性行为| 亚洲欧美在线免费观看| 99精品在线看| 色噜噜夜夜夜综合网| 免费一级a毛片夜夜看| 久久久99精品免费观看| 国产裸体视频网站| 美国毛片一区二区| 国产二区视频在线播放| 欧美精品导航| 亚洲v国产v在线观看| 婷婷精品在线观看| 99电影在线观看| 久久亚洲精品人成综合网| 91精品国产91久久久久久吃药| 免费av网站在线看| 亚洲人精品午夜在线观看| 免费观看黄色av| 欧美日韩mp4| 日韩精品一区二区亚洲av| 亚洲一区二区不卡免费| 永久免费未视频| 国产日产亚洲精品系列| 一区二区三区少妇| 成人永久免费视频| 久久久久久久高清| 毛片av一区二区| 国产熟人av一二三区| 一本色道久久综合| 无码 制服 丝袜 国产 另类| 91精品电影| 欧美亚洲视频一区| 欧美色女视频| 日本三级中国三级99人妇网站| 精品国产影院| 国产成人精品福利一区二区三区| 久久视频免费| 亚洲综合日韩中文字幕v在线| 视频欧美精品| 成人在线免费观看视视频| 91欧美精品| 国产精品爽黄69天堂a| 日本欧美日韩| 国产精品久久久久久久电影| 日韩性xxx| 国产精品久久一区| 精品国产欧美日韩一区二区三区| 国产精品吹潮在线观看| 免费观看亚洲| 日韩av不卡在线| 久久野战av| 国产精品欧美一区二区| 成人在线免费av| 国产精品黄色av| 日本一区二区中文字幕| 成人在线精品视频| 97品白浆高清久久久久久| 国产日韩精品一区观看| 色哟哟精品丝袜一区二区| 欧美日韩精品免费看| 国产亚洲一区二区三区不卡| 涩涩日韩在线| 欧美激情偷拍自拍| 第九区2中文字幕| 亚洲另类视频| 成人中文字幕av| 久久国产视频网| 无套内谢丰满少妇中文字幕| 大桥未久av一区二区三区中文| 亚洲激情 欧美| 2021国产精品久久精品| 国产又粗又猛又爽又黄av | 日韩久久精品电影| 国产资源在线看| 日韩在线观看免费av| 午夜伦理大片视频在线观看| 97香蕉超级碰碰久久免费的优势| 天堂久久午夜av| 亚洲一区久久久| 人人精品亚洲| 一本色道久久综合亚洲二区三区 | 日韩美女精品| 日韩电影天堂视频一区二区| 亚洲视频电影在线| 国产午夜伦鲁鲁| 九一九一国产精品| 亚洲一级Av无码毛片久久精品| 久久久综合视频| 欧美做爰啪啪xxxⅹ性| 亚洲不卡一区二区三区| 欧美视频xxxx| 日韩精品一区二区三区视频在线观看 | 欧美精品在欧美一区二区| 久久国产精品亚洲77777| а 天堂 在线| 91色|porny| 可以直接看的黄色网址| 欧美性色19p| 999av视频| 亚洲无限av看| 18video性欧美19sex高清| 国产欧美最新羞羞视频在线观看| 国产精品自在线拍| 在线一区亚洲| 久久精品人人做人人爽电影蜜月| 天堂网成人在线| 久久久亚洲欧洲日产国码αv| 2025国产精品自拍| 91久久精品国产91性色tv| 男人天堂手机在线观看| 日韩在线视频线视频免费网站| aaaaa黄色片| 理论片日本一区| 欧洲一级黄色片| 亚洲综合久久av| 国产一区二区女内射| 国产亚洲福利一区| 97人人爽人人澡人人精品| 亚洲iv一区二区三区| japanese国产精品| 亚洲欧洲日产国码无码久久99| 国产精品资源在线| 欧美性生给视频| 在线中文字幕一区| 视频一区二区免费| 欧美日韩国产第一页| 在线高清欧美| 亚洲人成网站在线播放2019| 噜噜噜在线观看免费视频日韩| 怡红院一区二区| 亚洲伊人色欲综合网| 国产女人18毛片水真多| 色小说视频一区| 国产精品天堂蜜av在线播放| 日韩三级在线播放| 久久先锋影音| 瑟瑟视频在线观看| 一本久久精品一区二区| 性感美女视频一二三| 17婷婷久久www| 欧美久久精品| 国产又黄又大又粗视频| xnxx国产精品| 亚洲成人第一网站| 亚洲片在线观看| 男人最爱成人网| 亚洲成人第一| 麻豆91在线看| 国产女人18水真多毛片18精品| 欧美一区二区三区的| 中文在线手机av| 91手机在线播放| 国内一区二区三区| 性活交片大全免费看| 天天综合天天综合色| 桃花色综合影院| 国产精品成久久久久三级| 欧美日中文字幕| 国产一级片中文字幕| 亚洲国产日韩a在线播放性色| 蜜桃视频污在线观看| 69久久夜色精品国产69| 久久成人av| 91高清国产视频| 亚洲精品一卡二卡| 色偷偷在线观看| 日本一区二区三区四区视频| 日韩综合一区| 色综合久久久无码中文字幕波多| 亚洲福利一二三区| 牛牛影视精品影视| 国产精品自产拍在线观看中文 | 伊是香蕉大人久久| 日本在线一区二区| 日韩精品一区在线视频| 久久久三级国产网站| 91在线公开视频| 久久久久久久久久久免费精品| 日韩精品亚洲aⅴ在线影院| 992kp快乐看片永久免费网址| 国产精品久久久久9999吃药| 亚洲精品18在线观看| 日本精品免费一区二区三区| 日韩激情在线| 欧产日产国产精品98| 91激情五月电影| 欧美xxxx视频| 色播亚洲视频在线观看| 国产成人在线影院| 丁香社区五月天| 久久在线视频在线| 天堂成人娱乐在线视频免费播放网站| 国产又大又黄又猛| 亚洲午夜免费福利视频| 国产专区在线播放| 国产日韩欧美综合精品| 秋霞成人午夜伦在线观看| 国产精品a成v人在线播放| 日韩在线观看网站| 香蕉久久夜色精品国产更新时间| 日韩欧美亚洲另类| 色综合亚洲欧洲| 日韩av官网| 中国人体摄影一区二区三区| 久久久久久久久久电影|