Spring Security配置permitAll后自定义Interceptor未生效问题求助
问题分析与解决方案
一、@Override注解报错问题
在Spring Boot 3.x(对应Spring 6+)版本中,org.springframework.web.servlet.HandlerInterceptor接口的preHandle、postHandle、afterCompletion方法已改为default方法(带有默认实现)。此时直接实现该接口时,若添加@Override注解报错,原因及解决方式如下:
- 类导入错误:确保导入的是
org.springframework.web.servlet.HandlerInterceptor,而非其他包下的同名类。 - 编译器校验问题:部分IDE或Java版本对接口default方法的
@Override注解校验严格,可直接移除该注解,不影响功能实现。
修正后的拦截器代码示例:
@Component public class JwtTokenAdminInterceptor implements HandlerInterceptor { private static final Logger log = LoggerFactory.getLogger(JwtTokenAdminInterceptor.class); public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("Received request: {} {}", request.getMethod(), request.getRequestURI()); if (!(handler instanceof HandlerMethod)) { log.info("Handler is not a HandlerMethod, skip interception"); return true; } log.info("Interceptor is called."); return true; } }
二、拦截器未生效问题
从你的配置来看,拦截器已注册但未触发,排查方向及解决办法:
请求路径匹配问题
- 确认测试请求路径属于
/admin/**且不在排除列表/admin/employee/login中,例如测试POST /admin/employee/list而非登录接口。 - 若需匹配
/admin本身,需在addPathPatterns中补充该路径:.addPathPatterns("/admin/**", "/admin")。
- 确认测试请求路径属于
@EnableWebMvc的影响- 在Spring Boot中,
@EnableWebMvc会禁用自动配置的WebMvcAutoConfiguration,可能导致DispatcherServlet映射路径异常,使请求无法到达拦截器。 - 解决方案:移除
@EnableWebMvc注解,Spring Boot自动配置的WebMvc会与你的WebMvcConfiguration(实现WebMvcConfigurer)兼容生效。
- 在Spring Boot中,
请求类型排查
- 若发送的是OPTIONS预检请求,拦截器中
handler不会是HandlerMethod,会直接返回true且不打印目标日志。可添加请求方法日志,确认请求类型。
- 若发送的是OPTIONS预检请求,拦截器中
Bean注入验证
- 在
WebMvcConfiguration中添加日志打印jwtTokenAdminInterceptor实例,或在拦截器构造方法中添加日志,确认Bean已被正确创建并注入。
- 在
修正后的WebMvc配置示例:
@Configuration public class WebMvcConfiguration implements WebMvcConfigurer { private static final Logger log = LoggerFactory.getLogger(WebMvcConfiguration.class); @Autowired private JwtTokenAdminInterceptor jwtTokenAdminInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { log.info("Start registering custom interceptors..."); registry.addInterceptor(jwtTokenAdminInterceptor) .addPathPatterns("/admin/**", "/admin") .excludePathPatterns("/admin/employee/login"); } }
内容的提问来源于stack exchange,提问作者Rrobinvip
相关产品推荐
相关产品推荐

