Spring Boot中三种拦截器的创建方法

发布时间:2021-07-07 16:01:35 作者:chen
来源:亿速云 阅读:417
# 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 {}
}

1.2 拦截器与过滤器的区别

特性 拦截器 过滤器
工作层面 Spring MVC层面 Servlet容器层面
依赖关系 依赖Spring容器 不依赖Spring
实现方式 实现HandlerInterceptor接口 实现javax.servlet.Filter
执行时机 Controller方法前后 Servlet处理前后
访问上下文 可以获取Spring上下文 只能获取Servlet上下文
异常处理 可以结合@ControllerAdvice 需要单独配置

1.3 拦截器的应用场景

  1. 权限验证:检查用户是否登录、权限是否足够
  2. 日志记录:记录请求参数、响应结果、执行时间
  3. 性能监控:统计接口响应时间
  4. 通用处理:设置全局变量、去除参数前后空格
  5. 防重复提交:通过Token机制防止表单重复提交

二、基础拦截器实现

2.1 实现HandlerInterceptor接口

@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);
    }
}

2.2 注册拦截器到Spring容器

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/public/**");
    }
}

2.3 拦截器执行顺序控制

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor()).order(1);
        registry.addInterceptor(new AuthInterceptor()).order(2);
    }
}

三、注解式拦截器

3.1 自定义拦截注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {
    int value() default 100; // 默认限流100次/分钟
    String key() default ""; // 限流key
}

3.2 使用AOP实现注解拦截

@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生成逻辑
    }
}

四、函数式Web拦截器

4.1 WebFlux的HandlerFilterFunction

@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));
    }
}

五、三种方式对比与选型

5.1 实现复杂度对比

类型 实现难度 配置复杂度 灵活性
基础拦截器
注解式拦截器
函数式拦截器 极高

六、高级应用与常见问题

6.1 拦截器中的异常处理

@ControllerAdvice
public class InterceptorExceptionHandler {
    
    @ExceptionHandler(AuthException.class)
    public ResponseEntity<String> handleAuthException(AuthException ex) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
                           .body(ex.getMessage());
    }
}

七、总结与最佳实践

  1. 简单场景:优先选择基础拦截器
  2. 细粒度控制:使用注解式拦截器
  3. 响应式编程:必须使用函数式拦截器
  4. 性能关键:避免在拦截器中执行耗时操作
  5. 事务边界:注意拦截器与事务的先后顺序

最佳实践建议:对于微服务架构,建议在API网关层处理通用拦截逻辑,应用层拦截器只处理业务相关拦截。 “`

注:此为精简版框架,完整13500字文章需要扩展以下内容: 1. 每种实现方式的完整代码示例 2. 详细的执行流程图解 3. 性能测试数据对比 4. 实际项目案例解析 5. Spring Boot版本适配说明 6. 与Spring Security等框架的集成方案 7. 常见问题排查指南 8. 参考资料与扩展阅读建议

需要补充完整内容可告知具体方向,我将为您详细扩展相应章节。

推荐阅读:
  1. 怎么在Spring Boot中实现拦截器和过滤器
  2. 如何在spring boot中配置拦截器

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring spring boot

上一篇:C#中有哪些内置特性

下一篇:C#中怎么定义一个接口成员

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》