Filter顾名思义就是过滤器,在JavaWeb体系中,他在服务端,卡在请求/响应与Servlet之间做一些操作:
过滤器相关的类的顶层接口如下,以下方法都由Web容器自动调用:
package
你可以看看这个Filter的实现类:
SpringMVC中的Filter在org.springframework.web.filter中:
其中有两个抽象类:GenericFilterBean和OncePerRequestFilter,org.springframework.web.filter中的其他类都是继承这两个类,还有一些其他常见的Filter比如CharacterEncodingFilter、CorsFilter和DelegatingFilterProxy等
首先是GenericFilterBean,它自己实现了init和destroy(后者为空实现)方法,doFilter交给子类实现,其中init负责将FilterConfig映射到BeanWrapper中,然后调用initFilterBean,不过这个方法实在子类中实现,目前实现这个方法的就只有DelegatingFilterProxy#initFilterBean,
DelegatingFilterProxy这个类的作用:
将Web体系中的Filter的doFilter()指向一个从spring上下文获取的bean,最终调用的是该bean的doFilter(),以后用的都是这个bean而不是原生Web体系的Filter,也正是因为是一个bean,所以才可以使用@AutoWired注入spring bean。将自己的Filter创建到Spring的上下文中,又能集成到web容器的filterChain上。
这就是DelegatingFilterProxy的作用,不懂得小伙伴可以看这篇文章:
反正我手长:GenericFilterBean与DelegatingFilterProxyzhuanlan.zhihu.com还有一个OncePerRequestFilter,这个类又是什么作用呢,来看看它的注释:
/**
意思是每个请求都会走这个过滤器,它的作用是通过更改request中的Filter状态,防止内部请求时多次调用Filter