过滤器

shuyepl 2022-07-18 21:15:12
Categories: Tags:

为什么要使用过滤器

在我们原先的项目中,每个用户在使用系统的时候,都要去获取 session ,对用户的登录状态进行判断,然后才能让其访问各个页面,如果我们的项目中有很多个 servlet ,这些 servlet 都对应了一系列的用户类型,每种类型的用户在使用各个网页之前都要进行登录状态的判断,这样的话,同样的代码我们要写很多片,代码没有达到复用的作用,现在通过过滤器,可以将这部分代码封装起来,达到复用的代码复用的作用。

所以,最最最重要的,就是过滤器是把重复使用的代码抽取出来,对程序的执行进行一个过滤操作,这个过滤操作可以在程序执行前,也可以在程序执行后。

过滤器怎么写

先编写一个类实现 jakarta.serlvlet.Filter 接口

注意:记得实现一个接口的时候,要实现接口中的所有方法。在这个 Filter 接口中,有三个方法,分别如下

init 方法

在 Filter 对象第一次被创建的时候调用,只调用一次。

doFilter 方法

只要用户发送一次请求,就执行一次,在这里面编写过滤规则。

destroy 方法

在 Filter 对象被销毁之前调用,只调用一次。

在 xml 文件配置 Filter

这个其实和 Servlet 差不多就是一模一样的,所以可以直接使用注解的方式,配置这些信息,在 Filter 上要写的注解是 @WebFilter ,在这个里面配置的路径要和你通过过滤器之后想要执行的 Servlet 配置的路径一样,这个路径可以使用通配符的方式配置,大概有三种常见的写法。

*。        这种方式不能在前面写上 /
/*
/dept/*

过滤器内方法的执行次序

默认情况下,在服务器启动之后,构造方法先执行,然后执行 init 方法,说明服务器在启动的时候过滤器对象就已经创建出来了,并且,

filter 对象是单例的。

如何执行过滤器对应的 Servlet

在 doFilter 方法中一定要写上下面的语句

chain.doFilter(request, response)

这行代码的意思是,执行下一个过滤器,如果后面还有过滤器的话,如果没有,则执行对应的 Servlet 。

Filter 的执行顺序

如果是在 web.xml 文件中对映射路径进行配置的,则按照 servlet-mapping 标签从上到下配置的顺序执行(配置的路径相同的情况)。它们的执行顺序很像栈数据结构。

如果是在注解中配置的,那么执行顺序是按照文件名(类名)的字典顺序来的。

Filter 对象的生命周期

Filter 对象的生命周期和 Servlet 对象的生命周期类似,区别在于,Filter 对象在服务器启动的时候就已经创建了,而 Servlet 则是用户第一次访问的时候创建对象。


参考链接:https://www.bilibili.com/video/BV1Z3411C7NZ?share_source=copy_web&vd_source=ab2c5095571010032601fa9e036d004a