Filter作用:对web请求进行拦截,通过一定的验证再决定是否放行访问系统。
一、实现Filter
- 自定义Filter类继承Servlet包中的Filter接口,在doFilter()方法中实现自定义逻辑
-
配置Filter(这里采用手动配置,另一种方式是使用@WebFilter注解自动配置)
这里拦截了"/hello"的请求,启动项目后访问localhost/hello可以看到控制台输出:
这样就实现了一个简单的Filter功能。
接下来尝试在刚刚的Filter中注入一个Spring Bean,这里用UserService来注入,并调用其getUser()方法。
再次测试localhost/hello,发现报错:
说明这时候的Filter不能注入Bean,原因是这个Filter来自Servlet包,并不是由Spring管理的,因此初始化的时间早于Bean注入的时间, 因此会出错,这个时候就轮到 DelegatingFilterProxy 出场了。
二、实现能够注入Bean的Filter
话不多说直接上代码。
- 与上文一样,Filter的内容不需要修改,同样注入UserService
- 重新配置Filter(这里仍然采用手动配置,区别在于使用了 DelegatingFilterProxy)
为了对比注释保留了第一种的配置。
再次测试localhost/hello,成功!说明这时候的Filter已经能够注入Bean。这样就 方便我们在Filter的逻辑中使用Spring容器中的Bean 了。
Ref:
spring boot过滤器FilterRegistrationBean
GenericFilterBean与DelegatingFilterProxy
Filter代理DelegatingFilterProxy
网友评论