• 【JavaEE-Servlet】Filter过滤器详解


    熟悉的关键字-Filter(回顾-联系-可以不看)

    filter这个关键字在JavaSEjdk1.8新特性stream流中的方法中是出现过:

    Stream filter(Predicate<? super T> predicate); 
    
    • 1

    这个方法返回一个子集流,过滤掉不满足条件的数据,返回符合条件的数据,非终端方法

    通过它可以直观的猜测这个关键字是和过滤数据有关系的。

    Filter概述

    • Filter是过滤器;
    • FilterServlet高级特性之一,实际就是实现Filter接口的Java类,主要还是Java程序;
    • 可以把Servlet程序看作是一个最终要执行的目标,可以使用过滤器Filter来添加过滤代码,这个过滤代码可以添加到Servlet执行之前,也可以添加到Servlet执行之后,Filter可以做到在Servlet这个目标程序执行之前过滤,也可以在目标程序执行之后过滤;
    • 一般情况下,都是在过滤器当中编写公共代码;
    • Filter之前发送请求访问Servlet

    在这里插入图片描述
    (可以看到三个Servlet都写了判断登录的代码,代码重复写,没有达到代码复用的效果)

    • Filter之后发送请求访问Servlet可以是以下这样的:

    在这里插入图片描述

    (经不经过过滤器看路径,先走过滤器再去寻资源,一个项目里面可以有多个过滤器,一个请求也可能经过多个过滤器再到所需资源)

    过滤器在WEB容器中哪里?

    在这里插入图片描述

    何时使用?

    只能说Filter过滤器功能很强大!!!

    • 需要限制用户访问某些资源时;
    • 需要处理请求时先处理某些资源时;
    • 需要对服务器响应的内容处理后再响应时。

    Filter生命周期

    和Servlet生命周期一致。

    唯一的区别:Filter默认情况下,在服务器启动阶段就实例化,而Servlet不会,Servlet是默认根据请求来的。

    过滤器单个实现

    1. 编写一个Java类实现一个接口:Jakarta.servlet.Filter,并且实现这个接口当中的所有方法;

    init方法:在Filter对象第一次被创建之后调用,并且只调用一次;(默认方法)
    doFilter方法:只要用户发送一次请求,则执行一次;
    destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。(默认方法)

    如果initdestroy方法没有特殊使用,子类可以不重写,它们俩是默认方法;Filter可以称为函数式接口!

    doFilter方法

    三个方法中一个doFilter方法是特殊的,(其他俩个和Servlet中是一致的)。

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException
    
    • 1
    • 2

    doFilter前俩参数是ServletRequestServletResponse对象,可以看到这是面向接口编程,可以实现任何协议的过滤操作!!!
    第三个参数FilterChainServlet中没有的。
    在这里插入图片描述

    • FilterChain接口是由WEB容器实现的,我们只管使用即可!!!

    下面是使用描述:
    在这里插入图片描述

    1. web.xml文件中对Filter进行配置或者利用注解(@WebFilter)进行配置,这个配置和Servlet很像;

    注意:Servlet对象默认情况下,在服务器启动的时候是不会新建对象的,Filter对象默认情况下,在服务器启动的时候新建对象。另外Servlet是单例的,Filter也是单例的!!!

    在这里插入图片描述

    在这里插入图片描述

    目标Servlet是否执行,取决于两个条件

    • 第一:在过滤器当中是否编写了:chain.doFilter(request,response);代码;
    • 第二:用户发送的请求路径是否和Servlet的请求路径一致。

    chain.doFilter(request,response);这行代码的作用:
    执行下一个过滤器,如果下面没有过滤器了,执行最终的Servlet

    注意:Filter的优先级天生就比Servlet优先级高;所以当路径一致是优先执行的是Filter,是否执行Servlet取决于以上写的那两个条件!!!

    关于Filter的配置路径

    • 精确匹配(/a.do,/b.do,/oa/list…)
    • 匹配所有路径(/*
    • 后缀匹配,不要以 / 开始*.do
    • 前缀匹配,要以 / 开始(/dept/*)

    Filter的执行顺序

    web.xml文件中进行配置的时候,Filter的执行顺序是什么?

    依靠filter-mapping标签的配置位置,越靠上优先级越高。

    使用WebFilter注解配置时,Filter的执行顺序是什么?

    比较Filter实现类的类名。

    比如FilterA和FilterB,则先执行FilterA;
    比如Filter1和Filter2,则先执行Filter1;

    过滤器的调用顺序

    遵循栈数据结构。

    职责链设计模式

    Filter过滤器这里有一个设计模式:职责链设计模式(也叫责任链设计模式)

    过滤器最大的优点:

    • 在程序编译阶段不会确定调用程序,因为Filter的调用顺序是配置到web.xml文件中,只要修改web.xml配置文件中filter.mapping标签的顺序就可以调整Filter的执行顺序,显然Filter的执行顺序是在程序运行阶段动态组合的,那么这种设计模式被称为职责链设计模式。

    • 职责链设计模式最大的核心思想:
      在程序运行阶段,动态的组合程序的调用顺序。

    Filter运用

    可以看看我Gitee中的oa3,里面有通过Filter改进后的CRUD
    使用Filter改进oa3

  • 相关阅读:
    小米华为,化干戈为玉帛!
    fast guide filter原理详解
    零基础学Java第六节(面向对象二)
    数据分片的艺术:Sharding Key为多节点数据库带来的巨大优势
    青少年CTF-WEB-2048
    jsonpath介绍与使用
    《痞子衡嵌入式半月刊》 第 73 期
    零基础Linux_9(进程)环境变量+进程地址空间+进程创建fork
    角互补三角形面积公式的证明过程
    前端的多种克隆方式和注意事项
  • 原文地址:https://blog.csdn.net/qq_63691275/article/details/128174789