在 Java(通常指 Spring / Spring Boot) 中,拦截器(Interceptor)要“生效”,一般分两步:写拦截器类 + 注册到 Spring 容器。下面用最常见的方式说明。
实现 HandlerInterceptor 接口:
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 在 Controller 之前执行
System.out.println("拦截器生效了");
return true; // true 放行,false 拦截
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
// Controller 执行后
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
// 视图渲染后
}
}
实现 WebMvcConfigurer:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**") // 拦截路径
.excludePathPatterns("/login"); // 排除路径
}
}
✅ 到这一步,拦截器就生效了
只写 Interceptor 不注册 = 不生效
.addPathPatterns("/api/**")
但请求是 /user/list
Security 优先级高于 Interceptor
.excludePathPatterns("/css/**", "/js/**")
@Component 但没扫描到检查包路径是否在启动类扫描范围内
| 对比 | 拦截器 | 过滤器 |
|---|---|---|
| 所属 | Spring | Servlet |
| 生效位置 | Controller 前后 | 请求最前面 |
| 能否用 Spring Bean | ✅ | ❌ |
System.out.println("拦截器执行");
或打断点看是否进入 preHandle
如果你用的是:
可以告诉我具体场景,我可以给你更精确的配置方式。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。