在 Java 开发中,拦截器(Interceptor)是一种在不修改原有代码逻辑的情况下,对请求或方法调用进行拦截、预处理或后处理的机制。它常用于权限校验、日志记录、事务管理、性能监控等场景。
下面从概念、常见类型、工作原理和示例几个方面说明。
拦截器就像“门卫”或“过滤器”:
✅ 好处:
用于 Web 请求拦截
接口:
HandlerInterceptor
主要方法:
preHandle() // 请求前
postHandle() // 请求后(视图渲染前)
afterCompletion() // 请求完成
示例:
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 {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
严格说不是“拦截器”,但功能类似
区别:
| 对比项 | Filter | Interceptor |
|---|---|---|
| 层次 | Servlet 层 | Spring MVC 层 |
| 依赖 | 不依赖 Spring | 依赖 Spring |
| 使用场景 | 编码、跨域 | 登录、权限 |
用于 SQL 执行拦截
接口:
Interceptor
常见用途:
更细粒度,拦截 任意方法
常见注解:
@Before
@After
@Around
示例:
@Aspect
@Component
public class LogAspect {
@Around("execution(* com.xxx.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 | HTTP 请求 | 编码、跨域 |
| Interceptor | Controller 请求 | 登录、权限 |
| AOP | 方法调用 | 日志、事务 |
Java 拦截器是一种横切关注点处理机制,用于在请求或方法执行前后统一处理逻辑,而不侵入业务代码。
如果你愿意,我也可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。