【JavaEE-Servlet】Filter过滤器详解

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

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

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

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

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

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假正经的小柴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值