SpringBoot拦截器未触发
时间: 2025-03-17 15:16:07 浏览: 35
### Spring Boot 拦截器配置及未触发的原因分析
#### 配置拦截器的关键步骤
在 Spring Boot 中,拦截器的配置通常涉及以下几个方面:
1. **创建拦截器类**
创建一个实现了 `HandlerInterceptor` 接口的类,并重写其三个核心方法:`preHandle`、`postHandle` 和 `afterCompletion`。这些方法分别对应请求处理前、视图渲染后以及整个请求完成后的行为[^2]。
```java
import org.springframework.web.servlet.HandlerInterceptor;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Pre-handle method called");
return true; // 返回true表示继续执行后续操作;false则中断请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Post-handle method called");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("After-completion method called");
}
}
```
2. **注册拦截器**
将拦截器注入到 Spring 容器中并指定需要拦截的路径。可以通过实现 `WebMvcConfigurer` 接口完成此操作[^3]。
```java
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 MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/api/**"); // 指定拦截路径
}
}
```
#### 拦截器未触发的常见原因及其解决方案
1. **路径匹配错误**
如果拦截器未触发,可能是由于路径模式不匹配。确保 `addPathPatterns` 方法中的路径与实际访问的 URL 一致。例如,如果设置为 `/api/**`,那么只有以 `/api/` 开头的请求才会被拦截[^4]。
2. **静态资源误拦截**
默认情况下,Spring Boot 不会对静态资源(如 CSS、JS 文件)应用拦截器。但如果手动设置了全局拦截规则,则可能会影响静态文件加载。可以在配置中排除静态资源路径:
```java
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**") // 全局拦截
.excludePathPatterns("/static/**", "/css/**", "/js/**"); // 排除静态资源
```
3. **过滤器优先级问题**
拦截器基于 Servlet 规范实现,在 DispatcherServlet 调度过程中生效。然而,某些场景下可能存在其他过滤器(Filter)或安全组件(如 Spring Security)抢占了请求处理权,从而导致拦截器无法正常工作。此时需调整过滤器和拦截器之间的顺序关系。
4. **返回值影响**
在 `preHandle` 方法中,如果返回值为 `false`,则会阻止后续逻辑运行,包括目标 Controller 的调用和其他拦截器链成员的工作。因此要确认该方法始终返回预期布尔值。
5. **Bean 加载异常**
若拦截器 Bean 未能成功初始化或者未正确装配至容器内,也可能引发此类现象。检查是否存在循环依赖或其他 DI 错误提示信息。
---
### 示例代码总结
以下是完整的拦截器配置案例:
```java
// 自定义拦截器
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Request intercepted at Pre-Handle stage.");
return true; // 继续向下传递控制流
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Response processed in Post-Handle phase.");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Final cleanup performed After Completion.");
}
}
// 配置类
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Bean
public CustomInterceptor customInterceptor() {
return new CustomInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor())
.addPathPatterns("/test/*") // 只拦截 /test 下的相关接口
.excludePathPatterns("/test/exclude"); // 特殊情况除外
}
}
```
---
阅读全文
相关推荐


















