在 Java 开发中,拦截器(Interceptor)通常指 Spring MVC 的 HandlerInterceptor 或类似机制(如 Struts2 Interceptor、MyBatis Interceptor、Feign Interceptor 等)。下面以 Spring MVC 拦截器 为主,系统说明其适用场景、不适合的场景和典型例子。
在请求到达 Controller 之前判断用户是否登录、是否有权限访问接口。
典型场景
示例
if (request.getSession().getAttribute("user") == null) {
response.sendRedirect("/login");
return false;
}
记录请求信息,用于监控、审计、问题排查。
记录内容
示例
long start = System.currentTimeMillis();
// 处理请求
long end = System.currentTimeMillis();
log.info("接口耗时:{} ms", end - start);
统计接口响应时间,发现慢接口。
适用
在请求前后对数据进行统一处理。
常见操作
防止用户短时间多次点击提交。
实现思路
统一设置跨域响应头。
response.setHeader("Access-Control-Allow-Origin", "*");
⚠️ 更推荐使用
@CrossOrigin或全局 CORS 配置
在请求进入业务前,根据域名或 token 切换数据源。
虽然异常通常在 @ControllerAdvice 处理,但拦截器可做统一入口控制。
❌ 复杂业务逻辑
❌ 数据库事务控制
@Transactional❌ 细粒度方法级权限
❌ 参数校验
@Valid / Validator| 对比项 | 拦截器 | 过滤器 | AOP |
|---|---|---|---|
| 作用层 | Spring MVC | Servlet | 方法级 |
| 能拿到 Controller | ✅ | ❌ | ✅ |
| 细粒度 | 中 | 粗 | 细 |
| 使用频率 | 高 | 中 | 高 |
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// 请求前
return true;
}
@Override
public void postHandle(...) {
// 请求后
}
@Override
public void afterCompletion(...) {
// 视图渲染后
}
}
Java 拦截器适合做“横切、统一、与请求相关”的控制逻辑,而不是业务处理。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。