最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring中Interceptor的使用小結(jié)

 更新時間:2025年12月14日 10:42:43   作者:有夢想的攻城獅  
Spring Interceptor是Spring MVC提供的一種機制,用于在請求處理的不同階段插入自定義邏輯,通過實現(xiàn)HandlerInterceptor接口并注冊攔截器,可以控制攔截器的執(zhí)行順序和路徑匹配規(guī)則,下面就來詳細的介紹一下,感興趣的可以了解一下

一、Interceptor 的核心概念

Interceptor(攔截器) 是 Spring MVC 提供的一種機制,用于在請求處理的不同階段插入自定義邏輯。其核心作用包括:

  • 預(yù)處理:在控制器方法執(zhí)行前進行權(quán)限校驗、日志記錄等。
  • 后處理:在控制器方法執(zhí)行后修改響應(yīng)數(shù)據(jù)或記錄結(jié)果。
  • 資源清理:在整個請求完成后釋放資源或處理異常。

與 Filter 的區(qū)別:

特性Interceptor(攔截器)Filter(過濾器)
作用范圍針對 Spring MVC 的控制器層作用于 Servlet 容器層面
依賴框架Spring MVC 管理Servlet 原生規(guī)范
數(shù)據(jù)訪問可操作 ModelAndView僅能操作 HttpServletRequest/Response。

二、Interceptor 的創(chuàng)建與配置

  1. 實現(xiàn)攔截器類
    繼承 HandlerInterceptor 接口,重寫以下方法:
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 請求前處理(如權(quán)限校驗)
        return true; // 返回 false 中斷請求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // 控制器執(zhí)行后、視圖渲染前處理(如修改 Model 數(shù)據(jù))
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 請求完成后處理(如資源清理)
    }
}
  1. 注冊攔截器
    通過 WebMvcConfigureraddInterceptors 方法配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**")     // 攔截路徑
                .excludePathPatterns("/login"); // 排除路徑
    }
}
  • 路徑匹配規(guī)則:支持 Ant 風格(如 /user/* 匹配單層路徑,/admin/** 匹配多級路徑)。
  • 多攔截器順序:通過 Order 注解或?qū)崿F(xiàn) Ordered 接口控制優(yōu)先級,值越小優(yōu)先級越高。

三、攔截器的執(zhí)行順序

假設(shè)注冊了 Interceptor1 和 Interceptor2:

  1. preHandle 方法:按注冊順序執(zhí)行(Interceptor1 → Interceptor2)。
  2. postHandle 方法:按注冊逆序執(zhí)行(Interceptor2 → Interceptor1)。
  3. afterCompletion 方法:按注冊逆序執(zhí)行(Interceptor2 → Interceptor1)。

中斷場景:若某一攔截器的 preHandle 返回 false,后續(xù)攔截器和控制器均不執(zhí)行,但已通過 preHandle 的攔截器的 afterCompletion 仍會執(zhí)行。

四、典型應(yīng)用場景

  1. 權(quán)限校驗
    preHandle 中檢查用戶登錄狀態(tài)或角色權(quán)限,拒絕非法請求。

    if (request.getSession().getAttribute("user") == null) {
        response.sendRedirect("/login");
        return false;
    }
    
  2. 日志記錄
    記錄請求路徑、參數(shù)、耗時等信息:

    long startTime = System.currentTimeMillis();
    request.setAttribute("startTime", startTime);
    // 在 afterCompletion 中計算耗時
    
  3. 性能監(jiān)控
    統(tǒng)計接口響應(yīng)時間,優(yōu)化慢請求。

  4. 數(shù)據(jù)預(yù)處理
    postHandle 中統(tǒng)一添加響應(yīng)頭或加密敏感數(shù)據(jù)。

五、注意事項與最佳實踐

性能優(yōu)化

  • 避免在攔截器中執(zhí)行耗時操作(如遠程調(diào)用)。
  • 合理設(shè)置攔截路徑,減少不必要的攔截。

常見問題排查

  • 攔截器未生效:檢查路徑匹配規(guī)則、是否注冊到 Spring 容器。
  • 順序混亂:通過 @Order 明確優(yōu)先級。

與 AOP 結(jié)合

  • 攔截器適用于請求生命周期中的橫切邏輯,而 AOP 更適用于方法級別的切面(如事務(wù)管理)。

六、完整示例

  1. 日志攔截器
public class LogInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("請求開始: " + request.getRequestURI());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("請求完成: " + request.getRequestURI());
    }
}
  1. 配置類
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/admin/**")
                .order(1); // 高優(yōu)先級
    }
}

總結(jié)

Spring Interceptor 是處理請求生命周期橫切邏輯的利器,通過靈活配置路徑和優(yōu)先級,可實現(xiàn)權(quán)限控制、日志記錄等通用功能。結(jié)合 preHandle、postHandleafterCompletion 的分階段處理,能有效提升代碼復(fù)用性和可維護性。

到此這篇關(guān)于spring中Interceptor的使用小結(jié)的文章就介紹到這了,更多相關(guān)spring Interceptor使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot項目打jar包與war包的詳細步驟

    SpringBoot項目打jar包與war包的詳細步驟

    SpringBoot和我們之前學(xué)習的web應(yīng)用程序不一樣,其本質(zhì)上是一個 Java應(yīng)用程序,那么又如何部署呢?這篇文章主要給大家介紹了關(guān)于SpringBoot項目打jar包與war包的詳細步驟,需要的朋友可以參考下
    2023-02-02
  • spring+springmvc整合mabytis時mapper注入失敗問題解決方法

    spring+springmvc整合mabytis時mapper注入失敗問題解決方法

    這篇文章主要介紹了spring+springmvc整合mabytis時mapper注入失敗問題解決方法 ,需要的朋友可以參考下
    2017-08-08
  • SpringMVC中常用注解與使用方法詳解

    SpringMVC中常用注解與使用方法詳解

    這篇文章主要介紹了SpringMVC中常用注解與使用方法,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Java線程的聯(lián)合用法實例分析

    Java線程的聯(lián)合用法實例分析

    這篇文章主要介紹了Java線程的聯(lián)合用法,結(jié)合實例形式分析了java線程聯(lián)合的原理、實現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • java IO流之轉(zhuǎn)換流的具體使用

    java IO流之轉(zhuǎn)換流的具體使用

    轉(zhuǎn)換流可以將一個字節(jié)流包裝成字符流,或者將一個字符流包裝成字節(jié)流,本文主要介紹了java IO流之轉(zhuǎn)換流的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 淺談十個常見的Java異常出現(xiàn)原因

    淺談十個常見的Java異常出現(xiàn)原因

    這篇文章主要介紹了十個常見的Java異常出現(xiàn)原因,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-03-03
  • java 將jsonarray 轉(zhuǎn)化為對應(yīng)鍵值的jsonobject方法

    java 將jsonarray 轉(zhuǎn)化為對應(yīng)鍵值的jsonobject方法

    下面小編就為大家分享一篇java 將jsonarray 轉(zhuǎn)化為對應(yīng)鍵值的jsonobject方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Java_異常類(錯誤和異常,兩者的區(qū)別介紹)

    Java_異常類(錯誤和異常,兩者的區(qū)別介紹)

    下面小編就為大家?guī)硪黄狫ava_異常類(錯誤和異常,兩者的區(qū)別介紹) 。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java classloader和namespace詳細介紹

    Java classloader和namespace詳細介紹

    這篇文章主要介紹了Java classloader和namespace詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • IDEA導(dǎo)入eclipse項目并且部署到tomcat的步驟詳解

    IDEA導(dǎo)入eclipse項目并且部署到tomcat的步驟詳解

    這篇文章主要給大家介紹了關(guān)于IDEA導(dǎo)入eclipse項目并且部署到tomcat的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面來一起學(xué)習學(xué)習吧
    2019-02-02

最新評論

建昌县| 麻江县| 长兴县| 开化县| 开阳县| 厦门市| 贺州市| 宁化县| 海阳市| 福鼎市| 日照市| 抚远县| 阳原县| 长治县| 吉木乃县| 当涂县| 荣成市| 长海县| 鄂伦春自治旗| 安庆市| 兰溪市| 崇礼县| 汉寿县| 乌拉特前旗| 北票市| 名山县| 清徐县| 谢通门县| 贵阳市| 西平县| 淳化县| 荆州市| 宜川县| 绍兴县| 广汉市| 威海市| 邻水| 辽阳市| 岑溪市| 武乡县| 衢州市|