Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 禁用@WebFilter(嵌入依赖项jar中)_Java_Jakarta Ee_Java Ee 6_Servlet Filters_Servlet 3.0 - Fatal编程技术网

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

Java 禁用@WebFilter(嵌入依赖项jar中),java,jakarta-ee,java-ee-6,servlet-filters,servlet-3.0,Java,Jakarta Ee,Java Ee 6,Servlet Filters,Servlet 3.0,有没有办法禁用嵌入式Servlet过滤器 我的项目有一个依赖项jar,其中包含一个映射到“/*”的@WebFilter 我需要jar(它有很多我公司的commons类),但是这个新项目不需要这个WebFilter,实际上这个新项目不会工作,因为这个过滤器检查用户身份验证,而新项目没有“loggedUser”。它就像一个网站 感谢正是出于这个原因,web.xml优先于注释。只需在web.xml中声明有问题的筛选器,并将其设置为伪造的内容,例如: <filter> <fil

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

我的项目有一个依赖项jar,其中包含一个映射到
“/*”

@WebFilter
我需要jar(它有很多我公司的commons类),但是这个新项目不需要这个WebFilter,实际上这个新项目不会工作,因为这个过滤器检查用户身份验证,而新项目没有“loggedUser”。它就像一个网站


感谢

正是出于这个原因,web.xml优先于注释。只需在
web.xml
中声明有问题的筛选器,并将其
设置为伪造的内容,例如:

<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>

巴德过滤器
com.example.badfilter
巴德过滤器
/此路径不存在/*

这将有效地禁用它。

如果您使用的是Spring Boot,@WebFilter可以由Spring Boot服务器自动实例化,而无需依赖bean定义。我发现解决这个问题的方法是在嵌入式Tomcat服务器识别@WebFilter之前,在Spring引导中注册我自己的过滤器。这样,@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;
}
/**
*保持相同的名字很重要;当Apache Catalina尝试自动注册筛选器时,
*它将检查是否已注册。
*@param-filter-SomeFilter
*@返回
*/
@豆子
公共过滤器注册bean注册(SomeFilter过滤器){
FilterRegistrationBean注册=新的FilterRegistrationBean(过滤器);
registration.setEnabled(true);
registration.setAsyncSupported(true);
registration.setName(“some.class.path.for.some.filter.SomeFilter”);
registration.setUrlPatterns(Lists.newArrayList(“/some url不存在/*”);
申报登记;
}

在我的场景中,我必须启用async=true,因此我也添加了这一行。

解包.jar,用过滤器删除该类,创建一个新的.jar-a.jar是一个.zip文件。在我看来,web.xml中的
过滤器名称
必须与
@WebFilter
注释中的
过滤器名称
匹配才能执行有效的覆盖。否则,web.xml中的筛选器声明将是一个添加,而不是重写。这不会阻止筛选器初始化。我的问题是在嵌入筛选器do init()期间发生错误。如何在不删除依赖项的情况下完全禁用它?@fwonce您应该使用组件库筛选器并扩展它,以便覆盖init()方法