当然可以。下面从 概念 → 常见应用场景 → 示例(Spring 拦截器) 三个层面给你讲清楚 Java 拦截器的应用场景。
拦截器是在 请求到达目标方法之前 / 之后 / 异常时 进行统一处理的机制,常用于:
本质:在不修改业务代码的前提下,增强或控制程序行为
场景:
用户访问后台接口前,判断是否已经登录、是否有访问权限。
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
✅ 优点:
场景:
前后端分离项目中,校验 JWT / OAuth Token。
String token = request.getHeader("Authorization");
if (!TokenUtil.verify(token)) {
response.setStatus(401);
return false;
}
✅ 常用于:
场景:
记录谁、什么时间、访问了什么接口。
log.info("用户访问:{},IP:{}",
request.getRequestURI(),
request.getRemoteAddr());
可记录:
long start = System.currentTimeMillis();
// 执行目标方法
long end = System.currentTimeMillis();
log.info("接口耗时:{} ms", end - start);
✅ 用于:
场景:
request.setCharacterEncoding("UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST");
(当然 Spring 也有专门 CORS 配置)
拦截器 + 异常处理器:
{
"code": 500,
"msg": "系统异常"
}
场景:
根据请求头选择不同数据库。
TenantContext.set(request.getHeader("tenantId"));
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(...) {
// 登录校验
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/login");
}
}
| 对比项 | 拦截器 | 过滤器 | AOP |
|---|---|---|---|
| 作用范围 | Controller | 所有请求 | 方法级 |
| 是否 Spring | 是 | Servlet | Spring |
| 使用难度 | 中 | 低 | 高 |
| 典型场景 | 登录、权限 | 编码、CORS | 日志、事务 |
Java 拦截器适合做“横切关注点”的事情:登录、权限、日志、监控、统一处理。
如果你愿意,我也可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。