SpringBoot拦截器excludePathPatterns排除路径失效仍拦截请求
问题场景
编写的UserController代码如下:
@RestController @RequestMapping("/user") public class UserController { @Resource UserService userService; @PostMapping("/roleChange") public Map<String, Object> setUserRole(String uuid, String email, String roleId){ return userService.setUserRole(uuid, email, roleId); } }
拦截器注册配置如下:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/user/login","/user/role-control"); } }
配置中已经在excludePathPatterns里添加了/user/role-control的排除规则,但实际请求对应路径时依然被拦截器拦截。
故障原因
拦截器排除规则配置的路径和接口实际映射的路径不匹配:
- 类级别
@RequestMapping("/user")加方法级别@PostMapping("/roleChange")拼接后,接口的真实访问路径是/user/roleChange - 排除规则里写的路径是
/user/role-control,二者路径名不一致:一个是驼峰格式的roleChange,一个是中划线分隔的role-control,无法命中排除逻辑。
Spring MVC的拦截器路径匹配不会自动做命名格式转换,必须和接口声明的映射路径完全一致才会生效。
修复方法
将拦截器配置中的排除路径修改为和实际接口路径一致即可,修正后的配置:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/user/login","/user/roleChange"); } }
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

