You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FilterRegistrationBean路径匹配异常:通配符不触发过滤器及URL管理需求

解决FilterRegistrationBean URL匹配不触发的问题

问题原因

Servlet规范的URL模式匹配规则不允许将*放在路径中间,/queries/*/adm这种写法不符合规范,因此Servlet容器不会匹配该路径,导致过滤器无法触发。而精确路径/queries/123/adm属于精确匹配范畴,符合规范所以能正常生效。

解决方案

方案一:过滤器内部实现路径与请求方法匹配

先让过滤器覆盖所有/queries/开头的路径,再在过滤器逻辑中做细粒度判断:

  1. 修改FilterRegistrationBean的URL模式:
@Bean
public FilterRegistrationBean tenantFilterRegistration() {
    FilterRegistrationBean result = new FilterRegistrationBean();
    result.setFilter(this.userFilter());
    // 覆盖queries下所有子路径
    result.addUrlPatterns("/queries/*");
    return result;
}
  1. 在过滤器的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:02:41