“拦截器”在不同的框架里含义不同,最常见的有 Spring 拦截器(HandlerInterceptor) 和 MyBatis 拦截器(Interceptor)。下面我以 Spring Boot 拦截器 为主给你一个完整、可直接用的配置示例,最后再简单对比其他拦截器。
Spring 拦截器用于在 Controller 方法执行前后 进行统一处理,例如:
注意:拦截器 只能拦截 Controller 请求,不能拦截静态资源(除非你配置)
实现 HandlerInterceptor 接口:
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class LoginInterceptor implements HandlerInterceptor {
// 在 Controller 方法执行前调用
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
String token = request.getHeader("token");
if (token == null || token.isEmpty()) {
response.setStatus(401);
response.getWriter().write("未登录");
return false; // 拦截
}
return true; // 放行
}
// Controller 执行后,视图渲染前
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
org.springframework.web.servlet.ModelAndView modelAndView) {
// 可选
}
// 整个请求完成后
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
// 可选
}
}
创建配置类:
import org.springframework.beans.factory.annotation.Autowired;
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 {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**") // 拦截路径
.excludePathPatterns( // 放行路径
"/login",
"/register",
"/error"
);
}
}
preHandle → Controller → postHandle → afterCompletion
多个拦截器时:
preHandle1 → preHandle2 → Controller → postHandle2 → postHandle1
| 对比项 | 拦截器 | 过滤器 |
|---|---|---|
| 所属 | Spring | Servlet |
| 拦截范围 | Controller | 所有请求 |
| 是否依赖 Spring | 是 | 否 |
| 使用场景 | 登录、权限 | 编码、跨域 |
@Intercepts({
@Signature(
type = StatementHandler.class,
method = "prepare",
args = {Connection.class, Integer.class}
)
})
@Component
public class MyBatisInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("SQL 执行前");
return invocation.proceed();
}
}
✅ 拦截器能拦截 static 资源吗?
默认不能,可通过配置解决
✅ 拦截器和 AOP 用哪个?
如果你用的是 Spring Cloud / WebFlux / Struts / Vue 前端拦截器,告诉我具体场景,我可以直接给你对应框架的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。