温馨提示×

温馨提示×

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

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

Java拦截器是什么

发布时间:2026-08-30 04:40:43 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

在 Java 中,拦截器(Interceptor)通常指的是一种在程序执行过程中,对请求或方法调用进行拦截、增强处理的机制,常用于AOP(面向切面编程)Web 请求处理权限校验日志记录事务管理等场景。


一、拦截器的核心思想

在不修改原有代码的前提下,对方法或请求进行统一处理。

拦截器通常用来做:

  • 权限校验
  • 登录状态检查
  • 日志记录
  • 参数校验
  • 性能监控
  • 事务控制
  • 请求/响应预处理或后处理

二、Java 中常见的拦截器类型

1️⃣ Spring MVC 拦截器(最常用)

Spring MVC 提供了 HandlerInterceptor,用于拦截 HTTP 请求。

核心接口

public interface HandlerInterceptor {

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler);

    void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView);

    void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}

执行顺序

preHandle → Controller 方法 → postHandle → afterCompletion

示例

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        if (request.getSession().getAttribute("user") == null) {
            response.sendRedirect("/login");
            return false; // 拦截请求
        }
        return true; // 放行
    }
}

注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/register");
    }
}

适合:登录拦截、权限校验、全局日志


2️⃣ Spring AOP 拦截器(方法级拦截)

Spring AOP 本质上也是一种拦截器,用于拦截方法调用

常见注解

  • @Before
  • @After
  • @Around
  • @AfterReturning
  • @AfterThrowing

示例

@Aspect
@Component
public class LogAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object log(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = pjp.proceed();
        System.out.println("耗时:" + (System.currentTimeMillis() - start));
        return result;
    }
}

适合:事务、日志、监控、缓存


3️⃣ Servlet Filter(过滤器,常与拦截器对比)

虽然不是严格意义上的“拦截器”,但功能类似。

对比项 Filter Interceptor
规范 Servlet 规范 Spring MVC
作用范围 所有请求 Spring MVC 请求
是否依赖 Spring
执行时机 更早 稍晚

Filter 更适合:编码处理、CORS、XSS 防护


4️⃣ MyBatis 拦截器

MyBatis 提供了 Interceptor 接口,用于拦截 SQL 执行。

@Intercepts({
    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class MyBatisInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("SQL 执行前");
        return invocation.proceed();
    }
}

适合:分页、SQL 日志、数据权限


三、拦截器 vs 过滤器 vs AOP

类型 拦截对象 典型用途
Filter HTTP 请求 编码、CORS
Interceptor Controller 请求 登录、权限
AOP 方法调用 日志、事务

四、一句话总结

Java 拦截器是一种在请求或方法执行前后插入自定义逻辑的机制,常用于统一处理横切关注点。

如果你愿意,我可以:

  • 帮你画一张 执行流程图
  • 对比 Interceptor 和 Filter 的真实执行顺序
  • 给你一个 面试版回答
向AI问一下细节

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

AI