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

Spring Boot攔截器Interceptor與過濾器Filter深度解析(區(qū)別、實現(xiàn)與實戰(zhàn)指南)

 更新時間:2025年06月17日 11:53:34   作者:設計師zhang  
對比SpringBoot攔截器與過濾器在執(zhí)行順序、作用范圍、異常處理等核心差異,指導開發(fā)實踐與選型策略,強調(diào)攔截器適合Web層通用邏輯,過濾器用于底層處理,建議結(jié)合APM工具優(yōu)化性能,感興趣的朋友跟隨小編一起看看吧

Spring Boot攔截器(Interceptor)與過濾器(Filter)深度解析:區(qū)別、實現(xiàn)與實戰(zhàn)指南

一、核心概念對比

1. 本質(zhì)區(qū)別

維度過濾器(Filter)攔截器(Interceptor)
規(guī)范層級Servlet規(guī)范(J2EE標準)Spring MVC框架機制
作用范圍所有請求(包括靜態(tài)資源)只處理Controller請求
依賴關系不依賴Spring容器完全集成Spring IOC容器
執(zhí)行順序最先執(zhí)行(在DispatcherServlet之前)在DispatcherServlet之后執(zhí)行
異常處理無法直接使用Spring的異常處理機制可以通過@ControllerAdvice統(tǒng)一處理

2. 執(zhí)行流程示意圖

HTTP Request
  ↓
Filter Chain(doFilter)
  ↓
DispatcherServlet
  ↓
Interceptor.preHandle
  ↓
Controller Method
  ↓
Interceptor.postHandle
  ↓
View Rendering(如有)
  ↓
Interceptor.afterCompletion
  ↓
Filter Chain(返回響應)

二、過濾器(Filter)開發(fā)指南

1. 基礎實現(xiàn)方式

@Component
public class LogFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        HttpServletRequest req = (HttpServletRequest) request;
        // 前置處理
        System.out.println("Request URI: " + req.getRequestURI());
        chain.doFilter(request, response); // 放行請求
        // 后置處理
        long duration = System.currentTimeMillis() - startTime;
        System.out.println("Request completed in " + duration + "ms");
    }
}

2. 高級配置技巧

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<LogFilter> loggingFilter() {
        FilterRegistrationBean<LogFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new LogFilter());
        registration.addUrlPatterns("/api/*");
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 設置優(yōu)先級
        return registration;
    }
}

典型應用場景

  • 請求日志記錄
  • 全局字符編碼設置
  • 跨域處理(CORS)
  • XSS防御過濾
  • 請求內(nèi)容壓縮/解壓

三、攔截器(Interceptor)開發(fā)指南

1. 標準實現(xiàn)模板

@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        if (!validateToken(token)) {
            response.sendError(401, "Invalid token");
            return false; // 中斷請求
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, 
                          HttpServletResponse response, 
                          Object handler,
                          ModelAndView modelAndView) throws Exception {
        // Controller方法執(zhí)行后,視圖渲染前
    }
    @Override
    public void afterCompletion(HttpServletRequest request, 
                               HttpServletResponse response, 
                               Object handler, 
                               Exception ex) throws Exception {
        // 請求完全結(jié)束后(包括視圖渲染)
    }
}

2. 注冊攔截器配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private AuthInterceptor authInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/public/**");
    }
}

典型應用場景

  • 接口權限驗證
  • 請求參數(shù)預處理
  • 接口耗時監(jiān)控
  • 敏感操作日志
  • 數(shù)據(jù)綁定前校驗

四、核心差異深度解析

1. 執(zhí)行順序?qū)Ρ葘嶒?/h3>

配置多個過濾器和攔截器時的執(zhí)行順序:

Filter1 → Filter2 → Interceptor.preHandle 
→ Controller 
→ Interceptor.postHandle 
→ Interceptor.afterCompletion 
→ Filter2 → Filter1

2. 異常處理差異

// 在過濾器中處理異常
public void doFilter(...) {
    try {
        chain.doFilter(request, response);
    } catch (Exception e) {
        response.sendError(500, "Server Error");
    }
}
// 在攔截器中處理異常
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> handleException(Exception e) {
        return ResponseEntity.internalServerError().body("Error occurred");
    }
}

3. 異步請求處理

// 攔截器需實現(xiàn)AsyncHandlerInterceptor
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, 
                                          HttpServletResponse response, 
                                          Object handler) {
    // 異步請求的特殊處理
}

五、最佳實踐與選型策略

1. 技術選型決策樹

是否需要處理靜態(tài)資源?
├─ 是 → 必須使用Filter
└─ 否 → 
   是否需要訪問Spring Bean?
   ├─ 是 → 選擇Interceptor
   └─ 否 → 
      是否需要最早處理請求?
      ├─ 是 → 選擇Filter
      └─ 否 → 根據(jù)業(yè)務復雜度選擇

2. 性能優(yōu)化建議

  • 過濾器:避免在過濾器中做復雜業(yè)務邏輯
  • 攔截器:preHandle方法盡量輕量化
  • 兩者都應避免:
    • 同步阻塞操作
    • 頻繁的IO操作
    • 大對象的內(nèi)存操作

3. 常見陷阱規(guī)避

  • 過濾器
    • 忘記調(diào)用chain.doFilter()導致請求阻塞
    • 修改請求參數(shù)未使用Wrapper類
  • 攔截器
    • 在postHandle中修改ModelAndView導致NPE
    • 異步請求中誤用afterCompletion

六、實戰(zhàn)案例演示

案例1:接口耗時監(jiān)控系統(tǒng)

// 攔截器實現(xiàn)
public class MetricsInterceptor implements HandlerInterceptor {
    private static final ThreadLocal<Long> startTime = new ThreadLocal<>();
    @Override
    public boolean preHandle(...) {
        startTime.set(System.currentTimeMillis());
        return true;
    }
    @Override
    public void afterCompletion(...) {
        long duration = System.currentTimeMillis() - startTime.get();
        metricsService.recordRequestTime(request.getRequestURI(), duration);
        startTime.remove();
    }
}

案例2:全局防重放攻擊過濾器

public class ReplayAttackFilter implements Filter {
    private Cache<String, Boolean> requestCache = 
        Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build();
    @Override
    public void doFilter(...) {
        String nonce = request.getHeader("X-Nonce");
        if (requestCache.getIfPresent(nonce) != null) {
            response.sendError(400, "Duplicate request");
            return;
        }
        requestCache.put(nonce, true);
        chain.doFilter(request, response);
    }
}

七、擴展知識

1. 與AOP的區(qū)別

  • AOP
    • 基于代理模式實現(xiàn)
    • 可以精確控制到具體方法
    • 更適合業(yè)務層面的切面處理
  • 攔截器
    • 基于HandlerMapping實現(xiàn)
    • 主要針對HTTP請求生命周期
    • 更適合Web層通用處理

2. 高級應用場景

  • 過濾器鏈:實現(xiàn)責任鏈模式
  • 攔截器棧:組合多個攔截邏輯
  • 動態(tài)啟用/禁用:結(jié)合配置中心實現(xiàn)

總結(jié)建議

  • 優(yōu)先使用攔截器處理Web層通用邏輯
  • 保留過濾器用于底層請求處理
  • 復雜場景可以組合使用兩者
  • 生產(chǎn)環(huán)境務必進行性能壓測

通過合理運用過濾器和攔截器,開發(fā)者可以構(gòu)建出高可維護性的Web應用架構(gòu)。建議結(jié)合APM工具(如SkyWalking)監(jiān)控兩者的執(zhí)行效率,持續(xù)優(yōu)化系統(tǒng)性能。

到此這篇關于Spring Boot攔截器Interceptor與過濾器Filter深度解析(區(qū)別、實現(xiàn)與實戰(zhàn)指南)的文章就介紹到這了,更多相關Spring Boot攔截器Interceptor與過濾器Filter區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot通過注解注入Bean的幾種方式解析

    SpringBoot通過注解注入Bean的幾種方式解析

    這篇文章主要為大家介紹了SpringBoot注入Bean的幾種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • SSM框架實現(xiàn)分頁和搜索分頁的示例代碼

    SSM框架實現(xiàn)分頁和搜索分頁的示例代碼

    本篇文章主要介紹了SSM框架實現(xiàn)分頁和搜索分頁的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java StackTraceElement實例代碼

    Java StackTraceElement實例代碼

    這篇文章主要介紹了Java StackTraceElement實例代碼,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 通過Java實現(xiàn)獲取表的自增主鍵值

    通過Java實現(xiàn)獲取表的自增主鍵值

    這篇文章主要為大家詳細介紹了如何通過Java實現(xiàn)獲取表的自增主鍵值,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的可以了解一下
    2023-06-06
  • 使用MybatisPlus實現(xiàn)sql日志打印優(yōu)化

    使用MybatisPlus實現(xiàn)sql日志打印優(yōu)化

    本文主要介紹了使用MybatisPlus實現(xiàn)sql日志打印優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-08-08
  • idea2020.1設置多個spring boot的service啟動的實現(xiàn)

    idea2020.1設置多個spring boot的service啟動的實現(xiàn)

    這篇文章主要介紹了idea2020.1設置多個spring boot的service啟動,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • MyBatis-Plus數(shù)據(jù)權限插件的簡單使用

    MyBatis-Plus數(shù)據(jù)權限插件的簡單使用

    在MyBatis-Plus中,通過DataPermissionInterceptor插件實現(xiàn)數(shù)據(jù)權限控制,首先需要創(chuàng)建自定義注解和處理類,利用JSQLParser庫動態(tài)修改SQL,實現(xiàn)按角色權限過濾數(shù)據(jù),配置類中注冊攔截器,確保只有授權用戶能訪問指定數(shù)據(jù),感興趣的可以了解一下
    2024-10-10
  • java多線程事務加鎖引發(fā)bug用戶重復注冊解決分析

    java多線程事務加鎖引發(fā)bug用戶重復注冊解決分析

    這篇文章主要為大家介紹了java多線程事務加鎖引發(fā)bug用戶重復注冊解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • java 替換docx文件中的字符串方法實現(xiàn)

    java 替換docx文件中的字符串方法實現(xiàn)

    這篇文章主要介紹了java 替換docx文件中的字符串方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • springboot 整合fluent mybatis的過程,看這篇夠了

    springboot 整合fluent mybatis的過程,看這篇夠了

    這篇文章主要介紹了springboot 整合fluent mybatis的過程,配置數(shù)據(jù)庫連接創(chuàng)建數(shù)據(jù)庫的詳細代碼,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2021-08-08

最新評論

高碑店市| 满城县| 和平县| 那坡县| 衡阳市| 泰安市| 运城市| 梨树县| 板桥市| 赣州市| 诏安县| 龙海市| 三都| 德令哈市| 五华县| 浦北县| 重庆市| 易门县| 义乌市| 手游| 江西省| 张家川| 米泉市| 平塘县| 高安市| 保亭| 会宁县| 盐城市| 略阳县| 九江市| 裕民县| 全南县| 佛山市| 临夏市| 九江市| 通榆县| 疏附县| 高雄县| 深泽县| 白玉县| 应城市|