禁用 @WebFilter(嵌入在依赖项 jar 中)

Posted

技术标签:

【中文标题】禁用 @WebFilter(嵌入在依赖项 jar 中)【英文标题】:Disable @WebFilter (embedded in dependency jar) 【发布时间】:2013-09-13 07:06:00 【问题描述】:

有没有办法禁用嵌入式 Servlet 过滤器?

我的项目有一个依赖 jar,其中包含(在 jar 中)映射到 "/*"@WebFilter。 我需要jar(它有很多我公司的公共类),但是这个新项目不需要这个WebFilter,实际上这个新项目不会工作,因为这个过滤器检查用户身份验证并且新项目没有“loggedUser”。就像一个网站

谢谢

【问题讨论】:

解压 .jar,使用过滤器删除该类,创建一个新的 .jar - .jar 是一个 .zip 文件 【参考方案1】:

web.xml 正是因为这个原因优先于注释。只需在 web.xml 中声明有问题的过滤器,并将其 <filter-mapping> 设置为虚假的,例如:

<filter>
    <filter-name>BadBadFilter</filter-name>
    <filter-class>com.example.BadBadFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>BadBadFilter</filter-name>
    <url-pattern>/this-path-does-not-exist/*</url-pattern>
</filter-mapping>

这将有效地禁用它。

【讨论】:

在我看来,web.xml 中的filter-name 必须与@WebFilter 注释中的filterName 匹配才能执行有效的覆盖。否则 web.xml 中的过滤器声明将是添加,而不是覆盖。 这不会阻止过滤器初始化。我的问题是在嵌入式过滤器执行 init() 期间发生错误。如何在不删除依赖的情况下完全禁用它? @fwonce 你应该使用组件库过滤器并扩展它以覆盖 init() 方法【参考方案2】:

如果您使用的是 Spring Boot,@WebFilter 可以由 Spring Boot Server 自动实例化,而无需依赖 Beans 定义。我发现解决问题的方法是在嵌入式 Tomcat 服务器识别 @WebFilter 之前在 Spring Boot 中注册我自己的过滤器。这样,@WebFilter 之前已经注册,嵌入式服务器不会覆盖你的。

为了实现这一点,您需要在服务器找到过滤器之前对其进行注册。我确实注册了我的过滤器并进行了如下更改:

/**
 * Creates the Bean. Observe that @WebFilter is not registered as a Bean.
 */
@Bean
public SomeFilter someFilter() 
    return new SomeFilter();

其次,您需要使用相同的名称进行注册。找到服务器用于注册过滤器的名称很重要。通常,如果@WebFilter 标记没有提供,它将是您的类的完整名称

/**
 * It is important to keep the same name; when Apache Catalina tries to automatically register the filter,
 * it will check that is has already been registered.
 * @param filter SomeFilter
 * @return
 */
@Bean
public FilterRegistrationBean registration(SomeFilter filter) 
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(true);
    registration.setAsyncSupported(true);
    registration.setName("some.class.path.for.some.filter.SomeFilter");
    registration.setUrlPatterns(Lists.<String>newArrayList("/some-url-does-not-exist/*"));
    return registration;

在我的场景中,我必须启用 async=true,所以我也添加了该行。

【讨论】:

以上是关于禁用 @WebFilter(嵌入在依赖项 jar 中)的主要内容,如果未能解决你的问题,请参考以下文章

Apache Ivy:解决嵌入在安装程序中的依赖项

Gradle,如何禁用所有传递依赖

禁用 WebFilter 的自动注册

Gradle:使用 Spring Boot 依赖项构建“fat jar”

在 Spring Boot 中嵌入 tomcat 中禁用 Jar Scan 的 scanManifest

Spring启用/禁用带有配置文件的嵌入式tomcat