禁用 @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 中)的主要内容,如果未能解决你的问题,请参考以下文章
Gradle:使用 Spring Boot 依赖项构建“fat jar”