2025年什么是Filter(过滤器)?

什么是Filter(过滤器)?什么是 Filter 过滤器 Filter 也称之为过滤器 它是 Servlet 技术中最实用的技术 Web 开发人员通过 Filter 技术 对 web 服务器管理的所有 web 资源 例如 Jsp Servlet 静态图片文件或静态 html 文件等进行拦截 从而实现一些特殊的功能 例如实现 URL 级别的权限访问控制

大家好,我是讯享网,很高兴认识大家。

什么是Filter(过滤器)?

​ Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

过滤器原理

​ 当我们使用过滤器时,过滤器会对游览器的请求进行过滤,过滤器可以动态的分为3个部分,1.放行之前的代码,2.放行,3.放行后的代码,这3个部分分别会发挥不同作用。

第一部分代码会对游览器请求进行第一次过滤,然后继续执行

第二部分代码就是将游览器请求放行,如果还有过滤器,那么就继续交给下一个过滤器

创建过滤器(Filter)

​ 1.先书写一个普通类,如果普通类实现了Filter接口,则此类为过滤器类

 public class Filter1 implements Filte 

讯享网
  1. 让普通类实现接口中的抽象方法,然后决定是否放行
    讯享网package com.bjpowernode.filter; import javax.servlet.*; import java.io.IOException; public class Filter1 implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } } 

Filter接口有3个方法,但是这里我们值实现一个,我们实现了一个doFilter方法,这个方法就是我们写过滤代码的地方,(另外两个我们会在生命周期里面讲解)

3.在web.xml文件配置过滤器的过滤路径或者通过注解方式配置(Filter的两种配置方式)

3.1注解方式

如果我们使用注解方式的话需要先了解属性,那么我们来先看一下源码

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package javax.servlet.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.servlet.DispatcherType; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebFilter { String description() default ""; String displayName() default ""; WebInitParam[] initParams() default {}; String filterName() default ""; String smallIcon() default ""; String largeIcon() default ""; String[] servletNames() default {}; String[] value() default {}; String[] urlPatterns() default {}; DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST}; boolean asyncSupported() default false; } 

里面的配置还是很多的,这里我们只讲解我们需要使用的

filterName:该filter的名字
initParams:初始化参数
displayName:filter显示名称
servletNames:指定对哪些servlet进行过滤
asyncSupported:是否支持异步模式
urlPatterns:指定拦截路径
value:指定拦截路径 (urlPatterns和value是一样的。只能配置一个,两个都配置就会报错)

注解配置

讯享网@WebFilter("/*") <!--过滤的路径-->这里的(/*)表示过滤所有的,里面的多个参数用 , 进行分隔。 

注意:如果我们仅仅需要配置一个拦截路径,那么我们可以直接简写@WebLister(“拦截路径”),如@WebFilter(“/*”)就是拦截所有请求。

3.2xml方式配置

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <filter> <filter-name>filter1</filter-name> <filter-class>com.bjpowernode.filter.Filter1</filter-class> <!--过滤器--> </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/*</url-pattern> <!--过滤的路径-->表示过滤所有的 </filter-mapping> </web-app> 

​ 这个就是xml配置方式,里面属性都是一样的,这个和Servlet的配置方式基本一样,这里就不再赘述了。

使用过滤器(Filter)

​ 我们先来感受一下如何使用过滤器,其它细节我们后面会一 一讲解。

讯享网package com.bjpowernode.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") // 注解方式 public class Filter1 implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("对request进行过滤"); filterChain.doFilter(servletRequest,servletResponse); // 放行 System.out.println("对request完成过滤"); } } 

然后 启动服务器,然后我们在游览器中输入<http://localhost:8080你会看到如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFqohHGR-54)(C:\Users\ADMINI~1\AppData\Local\Temp\06.png)]

注意:上面之所以出现这个页面是因为我们服务器下面没有资源。

然后我们打开后台你会看到如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FjL0XkeO-57)(C:\Users\ADMINI~1\AppData\Local\Temp\95.png)]

从上面的执行结果来看,我们此时就可以得出结论,过滤器是不会管资源是否存在的,而只会对配置的拦截路径进行拦截

1.1 Fliter(过滤器)的生命周期

同servlet对象一样,Filter对象的创建也是交给web服务器完成的,在web服务器创建和使用及最后销毁filter时,会调用filter对应的方法

初始化方法:

public void init(FilterConfig filterConfig);

和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

拦截请求方法

public void doFilter

这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。

销毁方法😗*


讯享网

public void destroy();

Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁。在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。

生命周期三个阶段的小小总结

Filter有3个阶段,分别是初始化,拦截和过滤,销毁。

1.初始化阶段:当服务器启动时,我们的服务器(Tomcat)就会读取配置文件,扫描注解,然后来创建我们的Filter。

代码演示

package com.bjpowernode.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") // 注解方式 public class Filter1 implements Filter { /* * 1. Filter的创建时机是 服务器启动的时候 * 2. init方法只调用一次,并紧跟构造器方法调用之后 * 3. doFilter 方法,每次请求都会进入 该方法 ,并且 是在调用service之前,能不能进入service 方法,就要看 doFilter 方法有没有放行 * 4. destroy 方法,在服务器正常关闭的请情况下,调用 * * */ // 构造器 public Filter1 (){ System.out.println("我是构造器!"); } @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init()"); // 这个是初始化方法,在服务器启动的时候就会执行 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //这个方法就是过滤和拦截的方法,当请求和拦截匹配时调用 System.out.println("doFilter"); } @Override public void destroy() { // 这个方法是销毁方法,只有在项目正常关闭的情况下才会执行 System.out.println("destroy"); } } 

启动服务器后台输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5HzRUK1-58)(C:\Users\ADMINI~1\AppData\Local\Temp\13.png)]

游览器访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S2AC4LPr-60)(C:\Users\ADMINI~1\AppData\Local\Temp\79.png)]

游览器访问过后后台输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oREeEfgt-61)(C:\Users\ADMINI~1\AppData\Local\Temp\12.png)]

在这里我们可以得出结论

在服务器启动的时候过滤器的构造器会执行,随后init()方法会执行,并且这他们两个只会在服务器启动的时候执行一次

然后我们再次通过游览器访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FjpK8P1v-62)(C:\Users\ADMINI~1\AppData\Local\Temp\67.png)]

后台输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGj1IFQk-64)(C:\Users\ADMINI~1\AppData\Local\Temp\39.png)]

在这里我们又得到一个结论

doFilter方法只会在每次有人访问的时候执行

关闭服务器后台输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jJZErgh-65)(C:\Users\ADMINI~1\AppData\Local\Temp\58.png)]

执行的结果都和我们预想的一样,这也就验证了我们上面所学生命周期结果是相吻合的了。

FilterConfig

FilterConfig 类见名知义, 它是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候, 也会同时创建一个 FilterConfig 类, 这里包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
1、 获取 Filter 的名称 filter-name 的内容
2、 获取在 Filter 中配置的 init-param 初始化参数
3、 获取 ServletContext 对象

FilterConfig的四个方法

  • getFilterName():获取filter的名称
  • getServletContext():获取ServletContext
  • getInitparamter(String var1):获取配置的初始参数的值
  • getInitParamterNames():获取配置的所有参数名称

FilterConfig实例运用

代码实列

讯享网package com.bjpowernode.filter; import javax.servlet.*; import java.io.IOException; import java.util.Enumeration; public class FilterConfig1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { Enumeration<String> names = filterConfig.getInitParameterNames(); //getInitParameterNames()得到所有配置参数的的名称 // 遍历出所有的参数信息并打印到控制台 while (names.hasMoreElements()) { String name = names.nextElement(); System.out.println(name+" = "+filterConfig.getInitParameter(name)); } } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } @Override public void destroy() { } } 

xml文件配置信息

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <--这是前面测试用的不用管注释而已--> <!--<filter> <filter-name>filter1</filter-name> <filter-class>com.bjpowernode.filter.Filter1</filter-class> &lt;!&ndash;过滤器&ndash;&gt; </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/*</url-pattern> &lt;!&ndash;过滤的路径&ndash;&gt; </filter-mapping>--> <filter> <filter-name>myFilterConfig</filter-name> <filter-class>com.bjpowernode.filter.FilterConfig1</filter-class> <init-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/web</param-value> </init-param> <init-param> <param-name>username</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value></param-value> </init-param> </filter> <filter-mapping> <filter-name>myFilterConfig</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> 

启动服务器输出结果如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0llKxuNM-66)(C:\Users\ADMINI~1\AppData\Local\Temp\79.png)]

FilterConfig读取配置文件演示完毕。

关于过滤器的讲解到这里就结束了,当然这上面讲的也很多不足之处,关于过滤器更多的知识点各位在另行查阅相关的文章

谢谢你的阅读!

56



myFilterConfig
/*

讯享网 启动服务器输出结果如下图所示 [外链图片转存中...(img-0llKxuNM-66)] FilterConfig读取配置文件演示完毕。 关于过滤器的讲解到这里就结束了,当然这上面讲的也很多不足之处,关于过滤器更多的知识点各位在另行查阅相关的文章 写的不好还请大佬们谅解 谢谢你的阅读! 
小讯
上一篇 2025-01-11 11:39
下一篇 2025-03-06 23:37

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/75233.html