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

时间:2013-09-09 18:03:37

标签: java java-ee java-ee-6 servlet-filters servlet-3.0

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

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

由于

2 个答案:

答案 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,所以我也添加了该行。