首页 > 解决方案 > FilterRegistrationBean url 模式不起作用

问题描述

我正在注册一个过滤器,如下所示用于日志输出

我想要网址模式:/*/api/*


@Bean
public CommonsRequestLoggingFilter commonsRequestLoggingFilter() {
    CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
    filter.setIncludeClientInfo(true);
    filter.setIncludeHeaders(true);
    filter.setIncludePayload(true);
    filter.setIncludeQueryString(true);
    filter.setMaxPayloadLength(1000);
    return filter;
}


     @Bean
    public FilterRegistrationBean filterRegistrationBean () {
        final FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.addUrlPatterns("/*/api/*");

        return registrationBean;
    }

标签: javaspringspring-bootspring-security

解决方案


由于代码注册了 Servlet Filter,因此 URL 模式必须符合 Servlet/Filters 支持的 URL 映射,如 Servlet 规范中所指定:

12.2 映射规范

在 Web 应用程序部署描述符中,使用以下语法来定义映射:

  • 以字符开头/并以后缀结尾的字符串/*用于路径映射。

  • 以前缀开头的字符串*.用作扩展映射。

  • 空字符串 ("") 是一种特殊的 URL 模式,它精确地映射到应用程序的上下文根,即表单的请求http://host:port/<context-root>/。在这种情况下,路径信息是/,servlet 路径和上下文路径是空字符串(“”)。

  • 仅包含字符的字符串/表示应用程序的“默认”servlet。在这种情况下,servlet 路径是请求 URI 减去上下文路径,并且路径信息为空。

  • 所有其他字符串仅用于完全匹配。

因此,一个 URL 只能有一个通配符,并且必须是第一个或最后一个:

  • /some/path/*
  • *.ext

推荐阅读