有没有办法禁用嵌入式Servlet过滤器?
我的项目有一个依赖jar,它包含(在jar中)@WebFilter
映射到"/*"
。
我需要jar(它有很多我公司的公共类),但是这个新项目不需要这个WebFilter,实际上这个新项目不起作用,因为这个Filter检查用户身份验证而新项目没有“loggedUser”。这就像一个网站
由于
答案 0 :(得分:9)
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>
这将有效地禁用它。
答案 1 :(得分:0)
如果您使用的是Spring Boot,则@WebFilter可以在不依赖Beans定义的情况下由Spring Boot Server自动实例化。我找到解决问题的方法是,在嵌入式Tomcat Server识别@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,所以我也添加了该行。