springfilter详解
⼀、Filter基本⼯作原理
1、Filter 程序是⼀个实现了特殊接⼝的 Java 类,与 Servlet 类似,也是由 Servlet 容器进⾏调⽤和执⾏的。
2、当在 l 注册了⼀个 Filter 来对某个 Servlet 程序进⾏拦截处理时,它可以决定是否将请求继续传递给 Servlet 程序,以及对请
求和响应消息是否进⾏修改。
3、当 Servlet 容器开始调⽤某个 Servlet 程序时,如果发现已经注册了⼀个 Filter 程序来对该 Servlet 进⾏拦截,那么容器不再直接调
⽤ Servlet 的 service ⽅法,⽽是调⽤ Filter 的 doFilter ⽅法,再由 doFilter ⽅法决定是否去激活 service ⽅法。
4、但在 Filter.doFilter ⽅法中不能直接调⽤ Servlet 的 service ⽅法,⽽是调⽤ FilterChain.doFilter ⽅法来激活⽬标 Servlet 的 service
⽅法,FilterChain 对象时通过 Filter.doFilter ⽅法的参数传递进来的。
5、只要在 Filter.doFilter ⽅法中调⽤ FilterChain.doFilter ⽅法的语句前后增加某些程序代码,这样就可以在 Servlet 进⾏响应前后实现
某些特殊功能。
6、如果在 Filter.doFilter ⽅法中没有调⽤ FilterChain.doFilter ⽅法,则⽬标 Servlet 的 service ⽅法不会被执⾏,这样通过 Filter 就可
以阻⽌某些⾮法的访问请求。
⼆、Filter链
1、在⼀个 Web 应⽤程序中可以注册多个 Filter 程序,每个 Filter 程序都可以对⼀个或⼀组 Servlet 程序进⾏拦截。如果有多个 Filter
程序都可以对某个 Servlet 程序的访问过程进⾏拦截,当针对该 Servlet 的访问请求到达时,Web 容器将把这多个 Filter 程序组合成⼀个 Filter 链(也叫过滤器链)。
2、Filter 链中的各个 Filter 的拦截顺序与它们在 l ⽂件中的映射顺序⼀致,上⼀个 Filter.doFilter ⽅法中调⽤
FilterChain.doFilter ⽅法将激活下⼀个 Filter的doFilter ⽅法,最后⼀个 Filter.doFilter ⽅法中调⽤的 FilterChain.doFilter ⽅法将激活⽬标 Servlet的service ⽅法。
3、只要 Filter 链中任意⼀个 Filter 没有调⽤ FilterChain.doFilter ⽅法,则⽬标 Servlet 的 service ⽅法都不会被执⾏。
三、Filter接⼝
⼀个 Filter 程序就是⼀个 Java 类,这个类必须实现 Filter 接⼝。javax.servlet.Filter 接⼝中定义了三个⽅法:init、doFilter、destory。
1、init ⽅法
(1)、在 Web 应⽤程序启动时,Web 服务器(Web 容器)将根据其 l ⽂件的配置信息来创建每个注册的 Filter 的实例对象,并将其保存在内存中。
(2)、Web 容器创建 Filter 的实例对象后,将⽴即调⽤该 Filter 对象的 init ⽅法。init ⽅法在 Filter ⽣命周期中仅被执⾏⼀
次,Web 容器在调⽤ init ⽅法时,会传递⼀个包含 Filter 的配置和运⾏环境信息的 FilterConfig 对象。
public voic init(FilterConfig filterConfig) throws ServletException
(3)开发⼈员可以在 init ⽅法中完成与构造⽅法类似的初始化功能,要注意的是:如果初始化代码要使⽤到 FilterConfig 对象,这些代码只能在 init ⽅法中编写,⽽不能在构造⽅法中编写(尚未调⽤ init ⽅法,即并没有创建 FilterConfig 对象,要使⽤它则必然出错)。
2、doFilter ⽅法
当⼀个 Filter 对象能够拦截访问请求时,Servlet 容器将调⽤ Filter 对象的 doFilter ⽅法。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException.ServletException
其中,参数 request 和 response 为 Web 容器或 Filter 链中上⼀个 Filter 传递过来的请求和响应对象;参数 chain 为代表当前 Filter 链的对象。
3、destroy ⽅法
该⽅法在 Web 容器卸载 Filter 对象之前被调⽤,也仅执⾏⼀次。可以完成与 init ⽅法相反的功能,释放被该 Filter 对象打开的资源,例如:关闭数据库连接和 IO 流。
四、FilterChain接⼝
该接⼝⽤于定义⼀个 Filter 链的对象应该对外提供的⽅法,这个接⼝只定义了⼀个 doFilter ⽅法。
public void doFilter(ServletRequest request, ServletResponse response) throws java.io.IOException.ServletException
FilterChain 接⼝的 doFilter ⽅法⽤于通知 Web 容器把请求交给 Filter 链中的下⼀个 Filter 去处理,如果当前调⽤此⽅法的 Filter 对象是Filter 链中的最后⼀个 Filter,那么将把请求交给⽬标 Servlet 程序去处理。
五、FilterConfig 接⼝
1、与普通的 Servlet 程序⼀样,Filter 程序也很可能需要访问 Servlet 容器。Servlet 规范将代表 ServletContext 对象和 Filter 的配置参
数信息都封装到⼀个称为 FilterConfig 的对象中。
2、FilterConfig 接⼝则⽤于定义 FilterConfig 对象应该对外提供的⽅法,以便在 Filter 程序中可以调⽤这些⽅法来获取 ServletContext 对象,以及获取在 l ⽂件中为 Filter 设置的友好名称和初始化参数。
3、FilterConfig接⼝定义的各个⽅法:
getFilterName ⽅法,返回 <filter-name> 元素的设置值。
spring framework表达式assigngetServletContext ⽅法,返回 FilterConfig 对象中所包装的 ServletContext 对象的引⽤。
getInitParameter ⽅法,⽤于返回在 l ⽂件中为 Filter 所设置的某个名称的初始化的参数值。
getInitParameterNames ⽅法,返回⼀个 Enumeration 集合对象。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论