我想知道,如果Spring Boot中的 Filter
类(对于Web应用程序)有任何注释? @Filter
?
我想在我的项目中添加自定义过滤器 .
The Spring Boot Reference Guide提及 FilterRegistrationBean
,但我不确定如何使用它 .
我想知道,如果Spring Boot中的 Filter
类(对于Web应用程序)有任何注释? @Filter
?
我想在我的项目中添加自定义过滤器 .
The Spring Boot Reference Guide提及 FilterRegistrationBean
,但我不确定如何使用它 .
17 回答
UPDATE: 2017-12-16:
在Spring boot 1.5.8.RELEASE中有两种简单的方法可以做到这一点,不需要xml .
First way: 如果您没有任何空间网址模式,可以像这样使用@Component :(完整代码和详细信息在这里https://www.surasint.com/spring-boot-filter/)
Second way: 如果你想使用url模式,可以像这样使用@WebFilter :(完整代码和详细信息在这里https://www.surasint.com/spring-boot-filter-urlpattern/)
但是您还需要在@SpringBootApplication类中添加@ServletComponentScan注释:
请注意,@ Component是Spring的注释,但@WebFilter不是 . @WebFiler是Servlet 3的注释 .
两种方式,你只需要在pom.xml中基本的spring boot依赖(不需要显式的tomcat嵌入式jasper)
WARNING: 第一种方法,如果Spring引导中的Controller返回到jsp文件,请求将通过过滤器两次 .
而在第二种方式中,请求将仅通过过滤器一次 .
我更喜欢第二种方式,因为它更类似于Servlet规范中的默认行为(https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html)
你可以在这里看到更多测试日志https://www.surasint.com/spring-boot-webfilter-instead-of-component/
如果要设置第三方过滤器,可以使用
FilterRegistrationBean
. 例如,相当于web.xml这些将是
@Configuration
文件中的两个bean以上是用spring-boot 1.2.3测试的
没有特殊的注释来表示servlet过滤器 . 您只需声明
Filter
类型Filter
(或FilterRegistrationBean
) . 一个示例(向所有响应添加自定义标头)在Boot自己的_369485中;如果您只声明
Filter
,它将应用于所有请求 . 如果还添加FilterRegistrationBean
,则还可以指定要应用的各个servlet和url模式 .Note:
从Spring Boot 1.4开始,
FilterRegistrationBean
不被弃用,只是将包从org.springframework.boot.context.embedded.FilterRegistrationBean
移动到org.springframework.boot.web.servlet.FilterRegistrationBean
首先,将
@ServletComponentScan
添加到SpringBootApplication类中 .其次,创建一个扩展Filter或第三方过滤器类的过滤器文件,并将
@WebFilter
添加到此文件中,如下所示:如果使用Spring Boot Spring Security,则可以在安全配置中执行此操作 .
在下面的示例中,我在UsernamePasswordAuthenticationFilter之前添加了一个自定义过滤器(请参阅all the default Spring Security filters and their order) .
和过滤器类
使用@WebFilter注释,可以按如下方式完成:
以下是我的自定义Filter类的示例:
我通过将它添加到Configuration类将其添加到Spring启动配置中,如下所示:
您可以在实现javax.servlet.Filter的类上使用@WebFilter javax.servlet.annotation.WebFilter
然后使用@ServletComponentScan进行注册
它更多的是建议而非答案,但如果您在Web应用程序中使用Spring MVC,那么最好使用Spring HandlerInterceptor而不是Filter
它可以完成相同的工作,但也可以 - 使用ModelAndView - 可以在请求处理之前和之后,或在请求完成之后调用其方法 .
1实现HandlerInterceptor接口并向您的类添加@Component注释
2配置您的拦截器
您也可以使用@WebFilter制作过滤器并实现Filter,它会做 .
添加过滤器有三种方法,
使用其中一个Spring构造型注释您的过滤器,例如
@Component
在Spring
@Configuration
中使用Filter
类型注册@Bean
在Spring中注册
@Bean
与FilterRegistrationBean
类型@Configuration
如果您希望过滤器适用于所有请求而无需自定义,则#1或#2将执行,否则使用#3 . 只要将过滤器类放在
SpringApplication
类的相同或子包中,就不需要为#1指定组件扫描 . 对于#3,只有当您希望Spring管理您的过滤器类(如使其具有自动连接依赖性)时,才需要与#2一起使用 . 它适用于我新的我的过滤器,它不需要任何依赖自动装配/注入 .虽然结合#2和#3工作正常,但我很惊讶它最终没有两个过滤器应用两次 . 我的猜测是,当它调用相同的方法来创建它们时,Spring将两个bean组合为一个 . 如果你想单独使用#3和authowiring,你可以
AutowireCapableBeanFactory
. 以下是一个例子,我在这里看到了很多答案,但我没有尝试过任何一个 . 我刚刚创建了过滤器,如下面的代码所示 .
并留下剩余的Spring Boot应用程序 .
我看到了@Vasily Komarov的回答 . 类似的方法,但使用抽象HandlerInterceptorAdapter类而不是使用HandlerInterceptor .
这是一个例子......
过滤器主要用于 Logger 文件,它根据您在项目中使用的 Logger 而变化Lemme explain for log4j2:
过滤器用于限制数据,我进一步使用阈值过滤器来限制流程中的数据级别,我提到了那里可以限制的级别 . 为了进一步参考,请参阅log4j2的级别顺序 - Log4J级别:ALL> TRACE> DEBUG> INFO> WARN> ERROR> FATAL> OFF
您需要实现Filter并需要使用@WebFilter注释(urlPatterns =“/ *”)
在Application或Configuration类中,您需要添加@ServletComponentScan,这样您的过滤器就会被注册 .
以下是在Spring Boot MVC应用程序中包含自定义筛选器的一种方法的示例 . 请务必在组件扫描中包含该包:
来自Spring docs,
Embedded servlet containers - Add a Servlet, Filter or Listener to an application
例如:
将此
@Bean
配置添加到@Configuration
类,并在启动时注册过滤器 .您还可以使用类路径扫描添加Servlet,过滤器和监听器,