添加注解绕过拦截器

先放一下百度的关于注解的基本东西

Target:描述了注解修饰的对象范围,取值在java.lang.annotation.ElementType定义,常用的包括:

  • METHOD:用于描述方法
  • PACKAGE:用于描述包
  • PARAMETER:用于描述方法变量
  • TYPE:用于描述类、接口或enum类型

Retention: 表示注解保留时间长短。取值在java.lang.annotation.RetentionPolicy中,取值为:

  • SOURCE:在源文件中有效,编译过程中会被忽略
  • CLASS:随源文件一起编译在class文件中,运行时忽略
  • RUNTIME:在运行时有效
  • @Documented - 标记这些注解是否包含在用户文档中。

我用的是配合拦截器和注解实现接口放过,反着也一样。主要原理就是通过反射获取是否包含注解。

package com.base.interceptor;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by Administrator on 2021/7/1.
 * 自定义注解 当拦截器识别到注解时 就跳过
 */
@Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreInterceptor {

}

然后去拦截器

//添加注解的过滤掉
if (handler instanceof HandlerMethod) {
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    IgnoreInterceptor methodAnnotation = handlerMethod.getMethodAnnotation(IgnoreInterceptor.class);
    if (methodAnnotation != null){
        System.out.println("Method @IgnoreInterceptor");
        return true;
    }
    /*Class<?> clazz = handlerMethod.getBeanType();
    if (AnnotationUtils.findAnnotation(clazz, IgnoreInterceptor.class) != null) {
        System.out.println("Class @UnAuthRequest");
        return true;
    }*/
}

 

<think>嗯,用户想了解Spring AOP中拦截器和切面的执行顺序以及它们的区别。首先,我需要明确拦截器和切面在Spring中的定位。拦截器通常属于Spring MVC的一部分,而切面是AOP的核心组件。记得文档里提到过,过滤器的执行顺序是最靠前的,然后是拦截器,最后才是切面。 用户可能对这几个概念容易混淆,比如过滤器和拦截器的区别,以及它们与切面的执行顺序。需要先理清每个组件的职责。过滤器是Servlet层面的,处理HTTP请求和响应;拦截器则是在Spring MVC中,可以访问Handler和ModelAndView;而切面则更灵活,作用于方法级别,处理日志、事务等。 执行顺序方面,根据引用[3]的Spring官方文档,切面的执行顺序可以通过@Order注解或Ordered接口来调整,但默认情况下,拦截器在切面之前执行。不过,如果有多个切面,它们的顺序可能由声明顺序或@Order值决定,高优先级的切面(数值小的@Order)的环绕通知会先执行。 可能用户在实际开发中遇到了执行顺序不符合预期的问题,需要知道如何调整顺序。这时候应该建议使用@Order注解,并举例说明如何配置。同时,需要区分拦截器和切面的应用场景,比如权限检查适合用拦截器,而事务管理更适合用切面。 还需要注意,拦截器只能拦截Controller层的请求,而切面可以作用于任何Spring管理的Bean。这可能影响用户选择使用哪种方式。总结的时候,要分点说明区别,确保用户能清晰理解两者的不同之处以及如何控制它们的执行顺序。</think>### Spring AOP 拦截器与切面的执行顺序及区别 #### 一、核心执行顺序 在 Spring 框架中,拦截器(Interceptor)和切面(Aspect)的执行顺序遵循以下规则(以 HTTP 请求为例): 1. **过滤器(Filter)** → **拦截器(Interceptor)** → **Controller 方法** → **切面(Aspect)** → **返回响应** 具体来说: - **过滤器**属于 Servlet 规范,最先执行(如权限验证、编码设置)[^2]。 - **拦截器**在过滤器之后执行,可拦截 Controller 请求(如日志记录、参数校验)。 - **切面**最后执行,作用于方法调用前后(如事务管理、性能监控)[^1]。 2. **切面内部的执行顺序** 若存在多个切面,默认按切面类的字母顺序执行,但可通过 `@Order` 注解或实现 `Ordered` 接口调整优先级。例如: ```java @Aspect @Order(1) // 数值越小,优先级越高 public class LoggingAspect { /*...*/ } ``` #### 二、拦截器与切面的区别 | **特性** | **拦截器(Interceptor)** | **切面(Aspect)** | |----------------|---------------------------------------|----------------------------------------| | **作用范围** | 仅拦截 Controller 层请求 | 作用于任意 Spring 管理的 Bean 方法 | | **实现方式** | 实现 `HandlerInterceptor` 接口 | 基于注解(如 `@Around`)或 XML 配置 | | **粒度** | 请求级别(URL、参数等) | 方法级别(方法调用前后) | | **依赖** | 依赖 Spring MVC 模块 | 依赖 Spring AOP 模块 | | **典型应用** | 权限校验、请求日志记录 | 事务管理、性能监控、异常处理 | #### 三、示例代码 1. **拦截器定义** ```java public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 权限验证逻辑 return true; // 返回 false 会中断请求 } } ``` 2. **切面定义** ```java @Aspect @Component public class TransactionAspect { @Around("execution(* com.example.service.*.*(..))") public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable { // 开启事务 Object result = joinPoint.proceed(); // 提交事务 return result; } } ``` #### 四、如何控制执行顺序? 1. **拦截器顺序**:通过 `WebMvcConfigurer` 添加拦截器时的注册顺序控制。 2. **切面顺序**:使用 `@Order` 注解或实现 `Ordered` 接口。 #### 五、总结 - **拦截器更适合请求层面的通用处理**(如鉴权),**切面更适合业务逻辑的横切关注点**(如事务)。 - 若需在 Controller 方法前后插入逻辑,优先使用拦截器;若需在 Service 或 DAO 层插入逻辑,使用切面[^1][^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhl_BeginLife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值