Filter 过滤器接口详解

article/2025/9/6 10:50:41

目录

1、Filter接口描述

2、如何使用Filter接口定义一个过滤器?

3、Filter接口的工作原理

4、Filter、FilterChain、FilterConfig、FilterRegistration、FilterRegistration.Dynamic 接口综述

(1)如何使用FilterConfig接口对Filter实例进行配置?

(2)如何在程序中动态注册和配置Filter实例?

5、过滤器和拦截器的区别


1、Filter接口描述

        Servlet Filter接口是Java Servlet API提供的一种标准接口,用于在Servlet容器中对HTTP请求和响应进行拦截和处理。它可以用于访问控制、安全验证、日志记录、字符编码转换等功能。

        Filter接口定义了三个方法:

  1. init方法:在Filter被初始化时调用,用于进行一些初始化操作。// 过滤器的初始化
  2. doFilter方法:对HTTP请求和响应进行拦截和处理的核心方法,可以对请求进行修改或过滤,也可以对响应进行修改或增强。// 核心方法,它的参数request,response,chain
  3. destroy方法:在Filter被销毁时调用,用于进行一些清理操作。

        Filter接口的实现类需要在web.xml文件中进行配置,并指定要拦截的URL模式,以及要使用的过滤器类。当符合URL模式的请求到达Servlet容器时,就会被该过滤器进行拦截和处理。

Servlet Filter接口的主要作用包括:

  1. 对请求和响应进行拦截和处理:Filter可以拦截Web应用程序中的请求和响应,对它们进行处理,并将它们传递给下一个Filter或Servlet。Filter可以在请求到达目标Servlet之前对请求进行修改,或在响应发送到客户端之前对响应进行修改,从而实现对请求和响应的拦截和处理。
  2. 实现功能增强:Filter可以在请求和响应中添加、删除或修改内容,从而实现对Web应用程序的功能增强。例如,Filter可以对请求进行身份验证,对响应进行压缩,或者对请求和响应进行日志记录等。
  3. 统一处理逻辑:Filter可以将Web应用程序中的一些公共逻辑进行抽象和封装,从而实现统一处理。例如,Filter可以对所有请求进行字符编码转换,或者对所有请求和响应进行异常处理等。

        Servlet Filter接口的设计可以帮助开发者将一些通用的处理逻辑从具体的Servlet中抽离出来,实现更加模块化和可复用的代码。这样可以减少代码重复,提高开发效率,同时也可以提高Web应用程序的可维护性和可扩展性。

2、如何使用Filter接口定义一个过滤器?

        以下是一个简单的使用 @WebFilter 注解定义过滤器的示例:

@WebFilter(filterName = "myFilter", urlPatterns = { "/hello/*" })
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 过滤器初始化代码}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 过滤器处理代码chain.doFilter(request, response);}@Overridepublic void destroy() {// 过滤器销毁代码}
}

        在上面的例子中,@WebFilter 注解指定了过滤器名称为 myFilter,过滤器的 URL 模式为 /hello/*,表示该过滤器会拦截所有以 /hello/ 开头的 URL。过滤器的处理逻辑在 doFilter() 方法中实现。

        @WebFilter 是用于在 Servlet 3.0 之后的版本中定义一个过滤器(Filter)。

        使用 @WebFilter 注解可以将一个类声明为一个过滤器,并指定过滤器的名称、URL 模式和过滤器顺序等信息。

        @WebFilter 注解有以下常用属性:

  • filterName:过滤器的名称,用于在 web.xml 文件或其他注解中引用该过滤器。
  • value/urlPatterns:过滤器的 URL 模式,可以是一个字符串数组或字符串,用于指定该过滤器所处理的 URL。
  • dispatcherTypes:指定该过滤器所处理的请求类型,如 REQUEST、FORWARD、INCLUDE 和 ASYNC 等。
  • initParams:过滤器的初始化参数,用于在过滤器初始化时设置一些配置参数。
  • asyncSupported:指定该过滤器是否支持异步请求处理。

3、Filter接口的工作原理

        Filter的工作流程如下:

  1. 客户端请求访问容器内的 Web 资源。
  2. Servlet 容器接收请求,并针对本次请求分别创建一个 request 对象和 response 对象。
  3. 请求到达 Web 资源之前,先调用 Filter 的 doFilter() 方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
  4. 在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源。
  5. 目标资源生成响应信息返回客户端之前,处理控制权会再次回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文。
  6. 响应信息返回客户端。

        Filter 实例在 Servlet 容器启动时创建,由 Servlet 容器负责创建和管理。创建时,会使用 Filter 的默认构造函数创建一个新的实例。当有 HTTP 请求到达 Web 应用程序时,Servlet 容器会使用这个实例来处理请求。

        下面是Tomcat 中 Filter 实例创建和执行的源码示例:// 所谓的拦截只是一个先后顺序的实现

public class ApplicationFilterChain implements FilterChain {// Filter 实例列表private Filter[] filters;// Filter 实例索引private int pos;// ...// 构造函数public ApplicationFilterChain(Filter[] filters) {this.filters = filters;this.pos = 0;}// 调用下一个 Filterpublic void doFilter(ServletRequest request, ServletResponse response)throws IOException, ServletException {// ...if (this.pos < this.filters.length) {Filter filter = this.filters[this.pos++];filter.doFilter(request, response, this);} else {// 如果所有 Filter 都已经执行完成,调用目标 Servletservlet.service(request, response);}}
}

4、Filter、FilterChain、FilterConfig、FilterRegistration、FilterRegistration.Dynamic 接口综述

        Filter、FilterChain、FilterConfig、FilterRegistration、FilterRegistration.Dynamic都是与Filter相关的接口或类,它们分别代表了Filter的不同方面和功能。以下是它们的具体介绍:

  1. Filter:Filter是一个接口,定义了对HTTP请求和响应进行拦截和处理的方法。实现Filter接口的类可以在Web应用程序中拦截HTTP请求和响应,并对它们进行预处理、后处理等。
  2. FilterChain:FilterChain是一个接口,代表一个过滤器链。当一个HTTP请求被多个Filter拦截时,FilterChain将这些Filter串起来,并按照它们在web.xml文件中的声明顺序进行调用。
  3. FilterConfig:FilterConfig是一个接口,它提供了对Filter的配置信息的访问。在Filter的init()方法中,可以通过FilterConfig获取Filter的初始化参数、ServletContext等信息。
  4. FilterRegistration:FilterRegistration是一个接口,它提供了对Filter的注册和配置的方法。通过FilterRegistration可以设置Filter的名称、URL模式、初始化参数等信息。
  5. FilterRegistration.Dynamic:FilterRegistration.Dynamic是FilterRegistration的子接口,它提供了动态配置Filter的方法。通过FilterRegistration.Dynamic可以动态添加、删除和修改Filter的URL模式、初始化参数等信息。

        Filter实现类可以通过这些接口或类访问Filter的配置信息、管理Filter的注册和调用顺序。

(1)如何使用FilterConfig接口对Filter实例进行配置?

        FilterConfig接口是Java Servlet规范中定义的一个接口,用于为Filter实例提供配置信息。可以通过以下步骤来使用FilterConfig接口对Filter实例进行配置:// 在初始化方法中使用配置

  1. 在Filter实现类中实现init()方法,并接收FilterConfig对象作为参数
  2. 在init()方法中,可以使用FilterConfig对象提供的方法获取Filter的配置信息。例如,可以使用getInitParameter()方法获取初始化参数,使用getServletContext()方法获取ServletContext对象等等。
  3. 使用获取到的配置信息对Filter实例进行配置。例如,可以根据获取到的初始化参数设置Filter的属性值,或者根据获取到的ServletContext对象获取其他组件并进行初始化。
  4. 在完成配置后,可以在init()方法的最后调用FilterConfig对象的getFilterName()方法获取Filter的名称,并输出一条日志来确认Filter已成功初始化。

        下面是一个示例代码片段,演示如何使用FilterConfig接口对Filter实例进行配置:

public class MyFilter implements Filter {private String myParam;public void init(FilterConfig config) throws ServletException {myParam = config.getInitParameter("myParam");// 对Filter进行配置// ...// 输出日志确认Filter已成功初始化String filterName = config.getFilterName();System.out.println("Filter " + filterName + " initialized.");}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 执行过滤操作// ...}public void destroy() {// 清理资源// ...}
}

(2)如何在程序中动态注册和配置Filter实例?

        在Java Servlet API中,Filter是一个可以在请求进入Servlet之前或Servlet处理完请求之后执行一些操作的组件。

        1)编写Filter类:首先需要编写Filter类来实现Filter接口,重写其doFilter方法,这个方法中实现对请求进行处理的逻辑。例如:

public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// Filter初始化时执行的代码}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 处理请求的代码filterChain.doFilter(servletRequest, servletResponse);// 处理响应的代码}@Overridepublic void destroy() {// Filter销毁时执行的代码}
}

        2)动态注册Filter:在Servlet的init方法中调用ServletContext的addFilter方法动态注册Filter,如下所示:// 在Servlet中进行注册

public class MyServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {FilterRegistration.Dynamic dynamicFilter = config.getServletContext().addFilter("myFilter", MyFilter.class);dynamicFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// Servlet处理请求的代码}
}

        其中,addFilter方法返回一个FilterRegistration.Dynamic对象,可以通过该对象配置Filter的初始化参数、URL模式等信息。addMappingForUrlPatterns方法可以指定Filter要处理的URL模式,也可以通过其他方法设置Filter的初始化参数等信息。

        3)动态配置Filter:通过FilterRegistration.Dynamic对象可以动态配置Filter的初始化参数、URL模式等信息。例如:

public class MyServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {FilterRegistration.Dynamic dynamicFilter = config.getServletContext().addFilter("myFilter", MyFilter.class);dynamicFilter.setInitParameter("paramName", "paramValue");dynamicFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/path/*");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// Servlet处理请求的代码}
}

        以上就是动态注册和配置Filter的步骤。需要注意的是,动态注册和配置Filter只能在Servlet容器启动时执行,不能在运行时动态修改。如果需要动态修改Filter的配置,需要重新启动Servlet容器。

5、过滤器和拦截器的区别

        过滤器(Filter)和拦截器(Interceptor)都是用于在Web应用中对请求进行处理的组件,它们的目的都是为了提供一种可重用的、可配置的、通用的请求处理机制。虽然它们的目的相同,但是它们之间还是存在一些区别:// 一个是JavaEE规范,一个是Spring实现

  1. 使用位置不同:过滤器是基于Servlet规范的,工作在Servlet容器内部(Servlet的service方法之前),对客户端请求进行预处理和后处理;而拦截器是基于Java的反射机制由Spring框架实现(service方法之中,对Controller的请求进行拦截处理。
  2. 执行时机不同:过滤器在Servlet容器内部的请求处理链中执行,也就是在请求进入Servlet之前或者Servlet处理完请求之后执行;而拦截器在请求进入Controller之前或者Controller处理完请求之后执行。

        一张图,非常的清除的描述了过滤器和拦截器的区别:

        至此,Filter接口的描述到此结束。


http://chatgpt.dhexx.cn/article/c4B89LjT.shtml

相关文章

Filter过滤器的作用

Filter过滤器的作用 Filter的作用&#xff1a;过滤器处于客户端和服务器端资源之间&#xff0c;对所有的请求或者响应进行拦截操作Filter过滤器在开发过程中的实际运用&#xff1a;Servlet 开发和Filter开发做对比Servlet开发Filter开发 Filter的作用&#xff1a;过滤器处于客户…

Filter 过滤器的使用

目录 一、Filter简介 二、Filter使用 1、Filter 的初体验 2、Filter 的生命周期 3、FilterConfig类 4、FilterChain过滤器链 5、Filter 的拦截路径 1&#xff09;精确匹配 2&#xff09;目录匹配 3&#xff09;后缀名匹配 一、Filter简介 Filter 过滤器它是 JavaWeb…

Filter过滤器工作原理

Filter过滤器工作原理 Filter简介 Filter也称之为过滤器&#xff0c;它是Servlet技术中最激动人心的技术之一&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态html文件等进行拦截&#xff0…

Filter过滤器

文章目录 FilterFilter过滤器的简单说明Filter的执行顺序 Eclipse创建简单的Filter过滤器Filter过滤不到指定路径 Filter Filter过滤器的简单说明 1.过滤器是一个驻留在服务器端的web组件&#xff0c;可以截取客户端和服务器端之间的请求与响应的信息 2.过滤器Filter是对客户…

FilterChain 过滤器链和拦截路径

Filter 过滤器 Chain 链&#xff0c;链条 FilterChain 就是过滤器链&#xff08;多个过滤器如何一起工作&#xff09; Filter 的拦截路径 精确匹配&#xff1a; <url-pattern>/target.jsp</url-pattern>以上配置的路径&#xff0c;表示请求地址必须为&#xff1…

Filter 过滤器

一、Filter 过滤器概念 ① Filter 过滤器它是 JavaWeb 的三大组件之一 三大组件分别是&#xff1a;Servlet 程序、 Listener 监听器、 Filter 过滤器 ② 他是 JavaEE 的规范&#xff0c;也就是接口 ③ 作用&#xff1a;拦截请求&#xff0c;过滤响应 拦截请求常见的应用场景有&…

filter过滤器的概念

文章目录 1. 图示2. 什么是Filter3. 代码演示4. 使用场景&#xff1a;事务处理 1. 图示 2. 什么是Filter Filter也属于Servlet规范Filter开发步骤&#xff1a;新建类实现Filter接口&#xff0c;然后实现其中的三个方法&#xff1a;init、doFilter、destroy 配置Filter&#xf…

Filter 过滤器使用

一、什么是Filter过滤器 Filter 过滤器它是 JavaWeb 的三大组件之一。 三大组件分别是&#xff1a;Servlet 程序、Listener 监听器、Filter 过滤器 Filter 过滤器它是 JavaEE 的规范。也就是接口 Filter 过滤器它的作用是&#xff1a;拦截请求&#xff0c;过滤响应。 拦截…

Filter过滤器(超详细)

声明&#xff1a;本文是根据博主学习内容所整理得的笔记&#xff0c;仅作为交流学习使用&#xff0c;需要观看视频的请移步&#xff1a;http://www.atguigu.com/ 1.Filter &#xff1f;什么是过滤器 Filter 过滤器它是 JavaWeb 的三大组件之一。 三大组件分别是&#xff1a;S…

GitHub使用教程(完整教程)

第一步&#xff1a;进入官网 &#xff08;https://github.com/&#xff09; 第二步&#xff1a;新建账号——输入用户名&#xff0c;邮箱&#xff0c; 密码——邮箱确认——登录GitHub 第三步&#xff1a;创建仓库 第三步&#xff1a;查看仓库 第四步&#xff1a;实现本地项目…

Git和Github详细入门教程(别再跟我说你不会Git和Github)

前言&#xff1a;基础差建议先观看B站视频&#xff08;关键字&#xff1a;GitHub&#xff09;&#xff0c;该教程是根据视频教程而制。 文章目录 01.Git概述02.Git的本地仓库操作 Git的版本回退操作 03.远程仓库05.Git的分支操作06.冲突的产生与解决07.Git实用功能08.忽略文件0…

GitHub Actions 入门教程

https://jiangren.com.au/blog/github-actions 一、GitHub Actions 是什么&#xff1f; 大家知道&#xff0c;持续集成由很多操作组成&#xff0c;比如抓取代码、运行测试、登录远程服务器&#xff0c;发布到第三方服务等等。GitHub 把这些操作就称为 actions。 很多操作在不…

小白入门~ GitHub和Git超详细使用教程

https://github.com/ 这是GitHub的官方网站&#xff0c;在官网上可以注册属于自己的GitHub账号&#xff0c;网上是全英文的&#xff0c;对于英语不好的同学建议使用谷歌浏览器&#xff0c;谷歌浏览器可以翻译网页变为中文使用起来十分方便。 通过简单的步骤之后你就会有一个属于…

GitHub使用教程(项目下载)

1.登录GitHub后选择左上角搜索框&#xff08;以点餐系统为例&#xff09; 2.选择合适的项目进入 3.选择合适的项目进入后&#xff0c;点击Code 4.点击Download ZIP即可下载项目代码压缩包

github使用教程图文详解(一)[入门]

git的使用和踩坑 Git的注册下载本地github工具绑定ssh秘钥获取ssh秘钥官网绑定ssh秘钥 创建远程库初始化仓库设置全局签名和单仓库签名的作用单仓库签名全局用户签名 提交到本地仓库git区域的划分提交到缓存区提交本地仓库和备注提交总结注意: 提交到远程仓库克隆远程仓库总结 …

GitHub 的 10 分钟快速入门教程

Hello World 这一篇是 GitHub 的 10 分钟快速入门教程&#xff0c;因为找不到中文版&#xff0c;大橙子自己给大家翻译了一下。 Hello World 项目是计算机编程的一个历史悠久的传统。这一篇我们也通过这个简单的练习让你学习到新的知识。那么就让我们开始 GitHub 的学习旅程吧…

【Github教程】史上最全github使用方法:github入门到精通

【初识Github】 首先让我们大家一起喊一句“Hello Github”。YEAH!就是这样。 Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中。目前,包括Rubinius和Merb在内的很多知名…

Github和Git的基本教程,适合新手

借鉴了这个博主的笔记 观看了b站up主的视频 Github和Git的基本使用 Github一.基本概念二 .创建账号三.创建仓库四&#xff1a;仓库管理五.仓库主页英文介绍 Git一. Git优势二.下载地址三.基本信息设置四.工作区域&#xff08;上传文件到Github&#xff09;五.删除文件六. 修改…

github入门教程最全中文版(官方)

该的Hello World项目是计算机编程历史悠久的传统。这是一个简单的练习&#xff0c;可以让你在学习新东西时开始学习。让我们开始使用GitHub&#xff01; 您将学习如何&#xff1a; 创建和使用存储库启动并管理新分支对文件进行更改并将其作为提交推送到GitHub打开并合并拉取请…

github注册以及安装教程

github注册以及安装教程 首先&#xff0c;我们了解一下github.gitHub 是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持 git 作为唯一的版本库格式进行托管&#xff0c;故名 gitHub。github 于 2008 年 4 月 10 日正式上线&#xff0c;除了 git 代码仓库托管及基…