FilterRegistrationBean路径匹配异常:通配符不触发过滤器及URL管理需求
解决FilterRegistrationBean URL匹配不触发的问题
问题原因
Servlet规范的URL模式匹配规则不允许将*放在路径中间,/queries/*/adm这种写法不符合规范,因此Servlet容器不会匹配该路径,导致过滤器无法触发。而精确路径/queries/123/adm属于精确匹配范畴,符合规范所以能正常生效。
解决方案
方案一:过滤器内部实现路径与请求方法匹配
先让过滤器覆盖所有/queries/开头的路径,再在过滤器逻辑中做细粒度判断:
- 修改FilterRegistrationBean的URL模式:
@Bean public FilterRegistrationBean tenantFilterRegistration() { FilterRegistrationBean result = new FilterRegistrationBean(); result.setFilter(this.userFilter()); // 覆盖queries下所有子路径 result.addUrlPatterns("/queries/*"); return result; }
- 在过滤器的
doFilter方法中添加路径与请求方法判断:
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String requestUri = httpRequest.getRequestURI(); String method = httpRequest.getMethod(); AntPathMatcher pathMatcher = new AntPathMatcher(); boolean shouldFilter = false; // 根据请求方法和路径判断是否执行过滤逻辑 switch (method) { case "PUT": shouldFilter = pathMatcher.match("/queries/*", requestUri) || pathMatcher.match("/queries/*/adm", requestUri) || pathMatcher.match("/queries/*/person/*", requestUri); break; case "POST": shouldFilter = pathMatcher.match("/queries/*/person", requestUri); break; case "DELETE": shouldFilter = pathMatcher.match("/queries/*/person/*", requestUri); break; } if (shouldFilter) { // 执行你的过滤器核心逻辑 // ... } chain.doFilter(request, response); }
方案二:直接使用Spring Ant风格路径匹配(Spring Boot环境)
Spring Boot的FilterRegistrationBean支持Ant风格路径,可直接配置需要过滤的路径:
@Bean public FilterRegistrationBean tenantFilterRegistration() { FilterRegistrationBean result = new FilterRegistrationBean(); result.setFilter(this.userFilter()); // 配置所有需要过滤的Ant风格路径 result.addUrlPatterns( "/queries/*", "/queries/*/adm", "/queries/*/person", "/queries/*/person/*" ); return result; }
如果需要区分请求方法,仍需在过滤器内部添加方法判断逻辑。
内容的提问来源于stack exchange,提问作者robert trudel
相关产品推荐
相关产品推荐

