Filter

网友投稿 235 2022-09-05

Filter

文章目录

​​什么是Filter​​​​Filter快速入门​​​​Filter执行流程​​​​Filter使用细节​​

​​Filter拦截路径配置​​​​过滤器链​​

什么是Filter

Filter 表示​​过滤器​​,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等):

而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图:

拦截器功能:过滤器一般完成一些​​通用​​的操作。比如每个资源都要写一些代码完成某个功能,我们总不能在每个资源中写这样的代码吧,而此时我们可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。例如​​权限管理​​​(比如有些资源只有在登陆过后才能查看)、 ​​统一编码处理​​​、 ​​敏感字符处理​​ 等等…

Filter快速入门

因为Filter也是Javaweb的三大组件之一,所以它的开发步骤也与Servlet非常的类似。

步骤①:定义类,实现 Filter接口,并重写其所有方法

其中init()加载、destroy()销毁都是生命周期的相关方法。而doFilter就是过滤器的核心方法,将来每一次访问过滤器都将会被执行。

步骤②:配置Filter拦截资源的路径:在类上定义 ​​@WebFilter​​ 注解。

注解的 ​​value​​​ 属性值 ​​/*​​ 表示拦截所有的资源

步骤③:在doFilter方法中输出一句话,并放行

上述代码中的 ​​chain.doFilter(request,response);​​ 就是放行,也就是让其访问本该访问的资源。

代码实现:

@WebFilter("/*")public class FilterDemo1 implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("FilterDemo1正在运行"); chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { }}

Filter执行流程

Filter的执行流程如下:

同时我们还要注意:在放行之前response里面是没有数据的。所以我们一般放行前对request进行处理,放行后对response进行处理:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("FilterDemo1正在运行");// 放行前对req进行处理 chain.doFilter(req, resp); // 放行后对resp进行处理 }

Filter使用细节

Filter拦截路径配置

拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 ​​@WebFilter​​​ 注解进行配置。如:​​@WebFilter("拦截路径")​​

拦截路径有如下四种配置方式:

拦截具体的资源:​​/index.jsp​​:只有访问index.jsp时才会被拦截目录拦截:​​/user/*​​:访问/user下的所有资源,都会被拦截后缀名拦截:​​*.jsp​​:访问后缀名为jsp的资源,都会被拦截拦截所有:​​/*​​:访问所有资源,都会被拦截

过滤器链

过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为​​过滤器链​​。

如下图就是一个过滤器链:

上图中的过滤器链执行是按照以下流程执行:

执行​​Filter1​​ 的放行前逻辑代码执行​​Filter1​​ 的放行代码执行​​Filter2​​ 的放行前逻辑代码执行​​Filter2​​ 的放行代码访问到资源执行​​Filter2​​ 的放行后逻辑代码执行​​Filter1​​ 的放行后逻辑代码

以上流程串起来就像一条链子,故称之为过滤器链。

那么有一个问题就随之而来:我们怎么知道哪一个过滤器在前面,哪一个过滤器在后面呢?

我们现在使用的是注解配置Filter,而这种配置方式的优先级是按照过滤器类名(字符串)的自然排序。

比如有如下两个名称的过滤器 : ​​BFilterDemo​​​ 和 ​​AFilterDemo​​​ 。那一定是 ​​AFilterDemo​​ 过滤器先执行。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Vuex①(简介、原理)
下一篇:营销报:吴亦凡被锤,韩束逆袭爆火!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~