Filter

举报
十八岁讨厌编程 发表于 2022/08/05 22:48:05 2022/08/05
【摘要】 文章目录 什么是FilterFilter快速入门Filter执行流程Filter使用细节Filter拦截路径配置过滤器链 什么是Filter Filter 表示过滤器,是 JavaWe...

什么是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 {

    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

如果我们不放行,也就是如下:
在这里插入图片描述
那么我们的页面打开是没有内容的:
在这里插入图片描述

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进行处理
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Filter使用细节

Filter拦截路径配置

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

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

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

过滤器链

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

如下图就是一个过滤器链:
在这里插入图片描述
上图中的过滤器链执行是按照以下流程执行:

  1. 执行 Filter1 的放行前逻辑代码
  2. 执行 Filter1 的放行代码
  3. 执行 Filter2 的放行前逻辑代码
  4. 执行 Filter2 的放行代码
  5. 访问到资源
  6. 执行 Filter2 的放行后逻辑代码
  7. 执行 Filter1 的放行后逻辑代码

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

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

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

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

文章来源: blog.csdn.net,作者:十八岁讨厌编程,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/zyb18507175502/article/details/125669387

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。