[Java Web]Filter | 一文搞懂Web三大组件之一的Filter

news/2024/11/24 4:46:17/

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:Java Web

目录

  • Filter
  • 1、概述
  • 2、执行流程
    • 2.1、简单介绍
    • 2.2、过滤器链
  • 3、代码实现
    • 3.1、实现步骤
    • 3.2、🔺配置拦截路径的方式
    • 3.3、具体实现
    • 3.4、🔺过滤器链实现

写在前面:本文介绍Web三大组件之一的Filter过滤器,另外两个组件为Servlet和Listener。
Servlet链接: Servlet
Listener链接:还没更新,后面再发布文章😂

Filter

1、概述

  Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
 在Java Web开发中,Filter是一种常用的组件,它可以在请求到达Web应用程序的Servlet之前或之后对请求进行拦截和处理
 Filter可以用来对请求参数进行过滤、对响应结果进行加工处理、实现安全认证、记录日志等等。

 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等)

而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图

拦截器拦截到后可以做什么?
过滤器一般完成一些通用的操作。比如每个资源都要写一些代码完成某个功能,我们不可能在每一个部分都编写大量重复的代码,而此时可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。

2、执行流程

2.1、简单介绍

如上图是使用过滤器的流程,那么便有如下问题:
● 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?从上图就可以看出肯定会回到Filter中
● 如果回到Filter中,是重头执行还是执行放行后的逻辑呢?如果是重头执行,就意味着 放行前逻辑 会被执行两次,肯定不符合要求;
所以访问完资源后,会回到 放行后逻辑,执行该部分代码。

对于过滤器的执行流程,归结起来就是:
 执行放行前逻辑->放行>访问相应的资源>执行放行后的逻辑

2.2、过滤器链

 过滤器链(Filter Chain)是由多个Filter组成的链式结构,用于对HTTP请求和响应进行拦截和处理。
 当一个请求到达Servlet容器时,Servlet容器会按照在web.xml中配置的顺序依次调用过滤器链中的每一个Filter,直到请求被Servlet处理或是Filter链被中断。

简单来说:过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。

过滤器链执行流程:

  1. 执行 Filter1 的放行前逻辑代码
  2. 执行 Filter1 的放行代码
  3. 执行 Filter2 的放行前逻辑代码
  4. 执行 Filter2 的放行代码
  5. 访问到资源
  6. 执行 Filter2 的放行后逻辑代码
  7. 执行 Filter1 的放行后逻辑代码
    以上流程串起来就像一条链子,绕一圈回来,故称之为过滤器链。

那么就有另外一个问题,要怎么判断是哪个过滤器先执行?
 后面会提到过滤器具体代码怎么实现,使用的是注解配置的方式。
 这种方式的优先级是按照过滤器类名的字符串的自然排序。
举个例子:
 BFilterDemo和AFilterDemo,那就是AFilterDemo先执行。
 FilterDemo1和FilterDemo2那就肯定是FilterDemo1先执行。
挨个比对字符串。

3、代码实现

3.1、实现步骤

使用的步骤分为三步:

  1. 创建一个实现javax.servlet.Filter接口的Java类,并重写所有的方法
  2. 在重写的doFilter()方法中,可以对请求进行拦截和处理。如果需要将请求传递给下一个Filter或Servlet,则需要调用FilterChain对象的doFilter()方法。
  3. 配置拦截路径。有两种方式:
    3.1. 在web.xml中配置Filter,将Filter映射到需要拦截的URL地址上。
    3.2. 使用注解配置Filter拦截路径

 Java中的Filter接口定义了三个方法:init()、doFilter()和destroy(),分别用于初始化Filter、处理请求和销毁Filter。其中,doFilter()方法是Filter的核心方法,用于对请求进行拦截和处理。

3.2、🔺配置拦截路径的方式

在Java Web中,拦截路径的书写方式可以分为以下几种:

  1. 精确匹配:拦截路径可以直接指定需要拦截的URL路径,例如:“/admin/index.jsp”。此时,只有当请求的URL路径和拦截路径完全匹配时,Filter才会拦截该请求。
  2. 目录匹配:拦截路径可以以"/“结尾,表示拦截指定目录下的所有请求,例如:”/admin/“。此时,所有以”/admin/"开头的URL路径都会被拦截。
  3. 扩展名匹配:拦截路径可以以".“开头,表示拦截指定扩展名的请求,例如:”.jsp"。此时,所有以".jsp"结尾的URL路径都会被拦截。
  4. 多重匹配:拦截路径可以使用多重匹配的方式,例如:“/admin//.jsp”。此时,只有当URL路径以"/admin/“开头,并且含有至少一个”/“,且以”.jsp"结尾时,Filter才会拦截该请求。
  5. 正则表达式匹配:拦截路径可以使用正则表达式来指定需要拦截的URL路径。在使用正则表达式时,需要将拦截路径设置为"/*"(拦截所有),并在Filter中编写正则表达式的匹配规则。

3.3、具体实现

下面是具体实现:
写一个JSP文件:

访问一下,看看效果:

  是可以成功访问的。

下面编写过滤器代码:

package com.xzl.web;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;/*** @author 逐梦苍穹* @date 2023/4/1 15:55*/
@WebFilter("/*")
public class FilterDemo implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("doFilter..成功拦截");}@Overridepublic void destroy() {Filter.super.destroy();}
}

这里配置拦截路径为拦截所有,下面再次访问JSP:
页面什么都没有,查看控制台:

3.4、🔺过滤器链实现

把刚刚创建的FilterDemo改为FilterDemo1,然后再创建一个FilterDemo2。
下面编写代码:

在控制台可以看到:

说明过滤器链的执行流程跟之前提到的是一样的:


http://www.ppmy.cn/news/37389.html

相关文章

STM32单片机WIFI-APP智能温控空调冷热可调红外遥控

STM32单片机WIFI-APP智能温控空调冷热可调红外遥控 实践制作DIY- GC0127-WIFI-APP智能温控空调 一、功能说明: 基于STM32单片机设计-WIFI-APP智能温控空调 二、功能介绍: STM32F103C系列最小系统板LCD1602显示器红外遥控电路DS18B20温度传感器1个继电…

Python轻量级Web框架Flask(3)——Flask路由参数/Flask请求与响应/重定项/异常处理

1、Flask路由参数和methods参数: 路由其实就是一个路径,就是a.route(‘/template_test/’)中的’/template_test/,每一个路由对应的是唯一的一个功能,如果要实现很多个功能,就需要很多个路由 methods参数就是用来设置…

【创作赢红包】<Windows>【技巧No.003】《Edge浏览器使用方法大全》(持续更新......)

《Edge浏览器使用技巧大全》1 插件1.1 插件获取1.2 广告拦截-AdGuard 广告拦截器1.3 自由复制网页文字-Simple Allow Copy1.4 图片另存为JPG/PNG/WebP1.5 标签页-itap新标签页1.6 网盘搜索-网盘资源全网搜索2 Edge自身功能2.1 朗读模式2.2 长截图2.3 下载加速1 插件 1.1 插件获…

java多线程相关知识讲解

一.多线程的基本概念。 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位) 线程:同一类线程共…

PCB模块化设计04——USB-Type-C PCB布局布线设计规范

目录PCB模块化设计04——USB-Type-C PCB布局布线设计规范USB Type-C功能介绍信号图示Type-C接口引脚定义USB 2.0差分对电源和接地引脚RX和TX引脚CC1和CC2针脚VCONN引脚SBU1和SBU2针脚USB供电PCB设计布线要求PCB模块化设计04——USB-Type-C PCB布局布线设计规范 USB Type-C US…

39岁程序员,失业中,看不到希望很迷茫,不知道路在何方?

39岁程序员,失业中,看不到希望很迷茫,不知道路在何方?第一次看到这个问题时,挺无奈的。39岁这个年纪,照理也应该有10多年工作经验了,工作经验丰富自然不用怀疑,作为老程序员&#xf…

立高转债上市价格预测

立高转债基本信息转债名称:立高转债,评级:AA-,发行规模:9.5亿元。正股名称:立高食品,今日收盘价:102.1元,转股价格:97.02元。当前转股价值 转债面值 / 转股价…

SpringCloud2022.x集成gateway

SpringCloud2022.x集成gateway1、环境依赖2、项目代码2.1、新建springboot项目2.1.1、修改pom.xml2.1.2、修改启动类2.1.3、修改配置文件2.1.4、nacos创建配置2.1.5、新增自定义路由配置类2.1.6、新增打印日志过滤器2.1.7、启动测试文档内容: 整合gateway网关使用Na…