您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。