# Spring Boot中三種攔截器的創建方法
## 目錄
- [一、攔截器概述](#一攔截器概述)
- [1.1 什么是攔截器](#11-什么是攔截器)
- [1.2 攔截器與過濾器的區別](#12-攔截器與過濾器的區別)
- [1.3 攔截器的應用場景](#13-攔截器的應用場景)
- [二、基礎攔截器實現](#二基礎攔截器實現)
- [2.1 實現HandlerInterceptor接口](#21-實現handlerinterceptor接口)
- [2.2 注冊攔截器到Spring容器](#22-注冊攔截器到spring容器)
- [2.3 攔截器執行順序控制](#23-攔截器執行順序控制)
- [三、注解式攔截器](#三注解式攔截器)
- [3.1 自定義攔截注解](#31-自定義攔截注解)
- [3.2 使用AOP實現注解攔截](#32-使用aop實現注解攔截)
- [3.3 注解攔截器實戰案例](#33-注解攔截器實戰案例)
- [四、函數式Web攔截器](#四函數式web攔截器)
- [4.1 WebFlux的HandlerFilterFunction](#41-webflux的handlerfilterfunction)
- [4.2 函數式攔截器配置](#42-函數式攔截器配置)
- [4.3 響應式編程中的攔截處理](#43-響應式編程中的攔截處理)
- [五、三種方式對比與選型](#五三種方式對比與選型)
- [5.1 實現復雜度對比](#51-實現復雜度對比)
- [5.2 性能差異分析](#52-性能差異分析)
- [5.3 適用場景建議](#53-適用場景建議)
- [六、高級應用與常見問題](#六高級應用與常見問題)
- [6.1 攔截器中的異常處理](#61-攔截器中的異常處理)
- [6.2 攔截器與事務管理](#62-攔截器與事務管理)
- [6.3 分布式系統中的攔截器設計](#63-分布式系統中的攔截器設計)
- [七、總結與最佳實踐](#七總結與最佳實踐)
## 一、攔截器概述
### 1.1 什么是攔截器
攔截器(Interceptor)是Spring MVC框架中提供的一種機制,允許開發者在請求處理的不同階段插入自定義邏輯。它基于AOP(面向切面編程)思想,可以對控制器(Controller)的請求進行前置處理、后置處理和完成處理。
```java
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {}
default void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {}
}
特性 | 攔截器 | 過濾器 |
---|---|---|
工作層面 | Spring MVC層面 | Servlet容器層面 |
依賴關系 | 依賴Spring容器 | 不依賴Spring |
實現方式 | 實現HandlerInterceptor接口 | 實現javax.servlet.Filter |
執行時機 | Controller方法前后 | Servlet處理前后 |
訪問上下文 | 可以獲取Spring上下文 | 只能獲取Servlet上下文 |
異常處理 | 可以結合@ControllerAdvice | 需要單獨配置 |
@Slf4j
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(HttpStatus.UNAUTHORIZED.value(), "Invalid token");
return false;
}
return true;
}
private boolean validateToken(String token) {
// 實際項目中應實現完整的token驗證邏輯
return StringUtils.isNotBlank(token);
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/api/**")
.excludePathPatterns("/api/public/**");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor()).order(1);
registry.addInterceptor(new AuthInterceptor()).order(2);
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {
int value() default 100; // 默認限流100次/分鐘
String key() default ""; // 限流key
}
@Aspect
@Component
public class RateLimitAspect {
private final ConcurrentHashMap<String, RateLimiter> limiters = new ConcurrentHashMap<>();
@Around("@annotation(rateLimit)")
public Object around(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {
String key = getRateLimitKey(joinPoint, rateLimit);
RateLimiter limiter = limiters.computeIfAbsent(
key, k -> RateLimiter.create(rateLimit.value()));
if (!limiter.tryAcquire()) {
throw new RuntimeException("Too many requests");
}
return joinPoint.proceed();
}
private String getRateLimitKey(ProceedingJoinPoint joinPoint, RateLimit rateLimit) {
// 實現key生成邏輯
}
}
@Component
public class WebFluxInterceptor implements HandlerFilterFunction<ServerResponse, ServerResponse> {
@Override
public Mono<ServerResponse> filter(ServerRequest request,
HandlerFunction<ServerResponse> next) {
long startTime = System.currentTimeMillis();
return next.handle(request)
.doOnSuccess(response ->
log.info("Request {} took {}ms",
request.path(),
System.currentTimeMillis() - startTime));
}
}
類型 | 實現難度 | 配置復雜度 | 靈活性 |
---|---|---|---|
基礎攔截器 | 低 | 中 | 中 |
注解式攔截器 | 中 | 低 | 高 |
函數式攔截器 | 高 | 高 | 極高 |
@ControllerAdvice
public class InterceptorExceptionHandler {
@ExceptionHandler(AuthException.class)
public ResponseEntity<String> handleAuthException(AuthException ex) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
.body(ex.getMessage());
}
}
最佳實踐建議:對于微服務架構,建議在API網關層處理通用攔截邏輯,應用層攔截器只處理業務相關攔截。 “`
注:此為精簡版框架,完整13500字文章需要擴展以下內容: 1. 每種實現方式的完整代碼示例 2. 詳細的執行流程圖解 3. 性能測試數據對比 4. 實際項目案例解析 5. Spring Boot版本適配說明 6. 與Spring Security等框架的集成方案 7. 常見問題排查指南 8. 參考資料與擴展閱讀建議
需要補充完整內容可告知具體方向,我將為您詳細擴展相應章節。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。