在 Java 中,拦截器(Interceptor)通常指的是一种在程序执行过程中,对请求或方法调用进行拦截、增强处理的机制,常用于AOP(面向切面编程)、Web 请求处理、权限校验、日志记录、事务管理等场景。
在不修改原有代码的前提下,对方法或请求进行统一处理。
拦截器通常用来做:
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");
}
}
✅ 适合:登录拦截、权限校验、全局日志
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;
}
}
✅ 适合:事务、日志、监控、缓存
虽然不是严格意义上的“拦截器”,但功能类似。
| 对比项 | Filter | Interceptor |
|---|---|---|
| 规范 | Servlet 规范 | Spring MVC |
| 作用范围 | 所有请求 | Spring MVC 请求 |
| 是否依赖 Spring | 否 | 是 |
| 执行时机 | 更早 | 稍晚 |
✅ Filter 更适合:编码处理、CORS、XSS 防护
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 日志、数据权限
| 类型 | 拦截对象 | 典型用途 |
|---|---|---|
| Filter | HTTP 请求 | 编码、CORS |
| Interceptor | Controller 请求 | 登录、权限 |
| AOP | 方法调用 | 日志、事务 |
Java 拦截器是一种在请求或方法执行前后插入自定义逻辑的机制,常用于统一处理横切关注点。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。