在 Java 中,“拦截器(Interceptor)”常见于 Web 开发(如 Spring、Spring MVC) 和 MyBatis 等框架中。下面我按最常见场景给你讲解,特别是 Spring 中的拦截器。
实现 HandlerInterceptor 接口:
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
// 控制器方法执行之前
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("请求前拦截");
// return true 放行,false 拦截
return true;
}
// 控制器方法执行之后
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("请求后处理");
}
// 整个请求完成后
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
System.out.println("请求完成");
}
}
在配置类中注册(Spring Boot):
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") // 拦截所有
.excludePathPatterns("/login"); // 排除登录
}
}
✅ 这样所有请求都会经过拦截器。
请求 → preHandle → Controller → postHandle → afterCompletion
preHandle 返回 false:请求直接结束MyBatis 使用 Interceptor 接口:
@Intercepts({
@Signature(type = Executor.class,
method = "update",
args = {MappedStatement.class, Object.class})
})
public class MyBatisInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("SQL 执行前");
return invocation.proceed();
}
}
| 对比 | 拦截器 | 过滤器 |
|---|---|---|
| 所属 | Spring | Servlet |
| 作用范围 | Controller | 所有请求 |
| 是否能用 Spring Bean | ✅ | ❌ |
如果你用的是 Spring Boot / Spring Cloud / Struts2 / WebFlux,可以告诉我,我可以给你对应示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。