JavaWeb开发Filter学习

简介: JavaWeb开发Filter学习

博主信息:

📢@博主: 嘟嘟的程序员铲屎官
💬:一位爱喵咪,爱开源,爱总结,爱分享技术的Java领域新星博主,如果你想和博主做朋友,关注博主,并私聊博主(给我发一条消息我就会关注你喔),博主本人也十分喜欢解决问题,如果你有什么问题,也可以来私聊博主喔,希望能够和C站的朋友相互学习,相互进步。
💬:关于本篇博客,最近在看廖雪峰大佬JavaWeb部分的知识,对大佬的 使用Filter这一篇进行个人总结,如果有什么错误的,请各位大佬能够及时提出,以免小弟误人子弟!

@Toc

一.使用Filter

1.Filter

为了把一些公用逻辑从各个Servlet中抽离出来,JavaEE的Servlet规范还提供了一种Filter组件,即过滤器,它的作用是,在HTTP请求到达Servlet之前,可以被一个或多个Filter预处理,类似打印日志、登录检查等逻辑,完全可以放到Filter中。

2.Filter处理方式

Filter的处理方式如下图:

  • 客户端的请求会经过过滤器,然后到达目标资源进行处理,目标资源处理之后再经过过滤器最后响应给客户端。

在这里插入图片描述

多个Filter组成一条Filter链如下图:

  • 在第1个过滤器处理一个请求后,会传递给第2个过滤器处理,直到最后一个过滤器将请求交给目标资源处理。目标资源在处理经过过滤的请求后,其响应信息从最后一个过滤器依次传递到第1个过滤器,最后传送到客户端。

在这里插入图片描述

3.Filter的核心对象

下面通过2个操作,来理解Filter的核心对象:
操作1:
在Tomcat中lib目录下,将servlet-api.jar 拷贝到任意一个文件下并进行解压
在这里插入图片描述
会生成如下二个文件:

  • javax:源码文件
  • META-INF文件:用于存储包和扩展的配置数据,如安全性和版本信息

在这里插入图片描述
进入..\javax\servlet
在这里插入图片描述
从上面的操作我们可知:

Filter位于javax.servlet包下, Filter相关的几个.class文件如下:

  • Filter.class
  • FilterChain.class
  • FilterConfig.class
  • FilterRegistration$Dynamic.class
  • FilterRegistration.class

操作2:

通过jad将.class反编译为.java文件

相关资料:
jad:jad.exe(java反编译工具)32/64位
教程: 如何将class文件转换成java文件

操作非常简单,windows+R输入cmd,进入dos按照下图所示进行操作即可
我的jad目录如下:
在这里插入图片描述

在这里插入图片描述
进入到反编译存放文件中,我们会发现Filter相关的.java只有如下四个:

  • Filter.java
  • FilterChain.java
  • FilterConfig.java
  • FilterRegistration.java

在这里插入图片描述

打开Filter.java,对该类进行分析
在这里插入图片描述

从上面的源码可知:
Filter是一个接口,该接口有如下三个抽象方法(方法的解释来源于<<JavaWeb入门经典>>这本书):

Filter接口抽象方法 方法解释
init(FilterConfig filterconfig) 过滤器初始化方法,此方法在初始化过滤器时调用
doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) 对请求进行过滤处理
destroy(); 销毁方法以释放资源

打开FilterConfig.java,对该类进行分析
在这里插入图片描述
从上面的源码可知:
FilterConfig是一个接口,用于配置Filter,该接口有如下四个抽象方法(方法的解释来源于<<JavaWeb入门经典>>这本书)

FilterConfig接口抽象方法 方法解释
getFilterName(); 用于获取过滤器名
getServletContext(); 获取Servlet上下文
getInitParameter(String s); 获取过滤器的初始化参数值
getInitParameterNames(); 获取过滤器的所有初始化参数

FilterConfig的配置可通过标签的方式进行配置:

@WebFilter(urlPatterns={"/index","/sign"})

该标签对访问/index/sign路径的请求将经过该过滤器,注意urlPatterns={"/*"}标识对所有请求都要经过该过滤器。

FilterConfig的配置可通过web.xml的方式进行配置(和Servlet类似):
在这里插入图片描述
如果多个过滤器应用于同一个资源,那么调用顺序就很重要,必须用部署描述符管理应该先调用哪一个过滤器。假如Filter1必须在Filter2之前调用,那么在部署描述符中,Filter1的声明就要放在 Filter2的声明之前。
在这里插入图片描述

打开FilterChain.java文件,对该类进行分析
在这里插入图片描述
从上面的源码可知:
FilterChain是一个接口,该接口只有如下一个抽象方法

   public abstract void doFilter(ServletRequest servletrequest, ServletResponse servletresponse)
        throws IOException, ServletException;

此方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器是过滤器链中的最后一个过滤器,那么请求将传送给目标资源。

打开FilterRegistration.java,对该类进行分析
在这里插入图片描述
从上面的源码可知:
FilterRegistration是一个接口,接口中有一个嵌套接口和4个抽象方法
嵌套接口:

public static interface Dynamic extends FilterRegistration,Registration.Dynamic
{
}

通过该接口可以进一步配置Filter,通过ServletContext上的addFilter方法注册Filter。

4个抽象方法:

FilterRegistration接口抽象方法 方法解释
addMappingForServletNames(EnumSet enumset, boolean flag, String as[]); 通过ServletNames添加的映射
getServletNameMappings(); 获取Servlet映射名称集合
addMappingForUrlPatterns(EnumSet enumset, boolean flag, String as[]); 通过UrlPatterns添加映射
getUrlPatternMappings(); 获取当前可用URL模式映射。

总结: 从上面的分析我们可以知道,Filter是一个接口,该接口下有三个抽象方法init()用于初始化Filter,doFilter()用于处理过滤的业务逻辑,destroy()用于销毁Filter,然后就是与Filter相关的二个接口,FilterConfig接口用于Filter的配置,FilterChain接口用于对Filter链进行管理,通过doFilter()方法将请求向下传递给下一个过滤器或目标资源,另外还有一个FilterRegistration接口用于对Filter进一步进行配置。

4.Filter例子(字符编码过滤器)

在前面我们每编写一个Servlet都会在相应的doGet()/doPost()方法中写如下代码用于避免出现乱码,显然该代码是一个公用的代码,对于这种代码我们可以将它放到Filter中的doFilter()中进行处理,这样就避免了重复编写此代码。
在这里插入图片描述

项目结构:
在这里插入图片描述
IndexServlet.java
在这里插入图片描述

SignInServlet.java
在这里插入图片描述

index.html
在这里插入图片描述
运行效果:
在这里插入图片描述
点击跳转到IndexServlet
在这里插入图片描述
点击跳转到SignServlet
在这里插入图片描述
解决方法:
在该项目中创建一个filter的包,在该包下创建一个EncodingFilter.java类该类实现Filter接口,并重写该接口的三个抽象方法,通过@WebFilter标签初始化FilterConfig,再将IndexServlet和SignInServlet的公用代码移到该类的doFilter()中,然后通过FilterChain.doFilter()方法传递到下一个Filter或目标资源。
在这里插入图片描述
再次运行效果一致,但是Servlet中少了公用代码:
IndexServlet.java
在这里插入图片描述
在这里插入图片描述

相关文章
|
12天前
|
人工智能 安全 IDE
一天成为Java开发高手:用飞算JavaAI实现十倍提效
“一天成为Java开发高手”曾被视为天方夜谭,但飞算JavaAI的出现改变了这一局面。这款AI开发助手通过智能引导、需求分析、自动化逻辑处理和完整代码工程生成,大幅简化了Java开发流程。它不仅帮助新手快速上手,还让资深开发者提高效率,减少调试时间。现在,参与“飞算JavaAI炫技赛”,展示你的开发实力,赢取丰厚奖品!
|
24天前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
46 12
|
3天前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
|
4天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
12天前
|
人工智能 Java 数据处理
Java高级应用开发:基于AI的微服务架构优化与性能调优
在现代企业级应用开发中,微服务架构虽带来灵活性和可扩展性,但也增加了系统复杂性和性能瓶颈。本文探讨如何利用AI技术,特别是像DeepSeek这样的智能工具,优化Java微服务架构。AI通过智能分析系统运行数据,自动识别并解决性能瓶颈,优化服务拆分、通信方式及资源管理,实现高效性能调优,助力开发者设计更合理的微服务架构,迎接未来智能化开发的新时代。
|
2月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
42 10
|
2月前
|
前端开发 Java 程序员
菜鸟之路day02-04拼图小游戏开发一一JAVA基础综合项目
本项目基于黑马程序员教程,涵盖面向对象进阶、继承、多态等知识,历时约24小时完成。项目去除了登录和注册模块,专注于单机游戏体验。使用Git进行版本管理,代码托管于Gitee。项目包含窗体搭建、事件监听、图片加载与打乱、交互逻辑实现、菜单功能及美化界面等内容。通过此项目,巩固了Java基础并提升了实际开发能力。 仓库地址:[https://gitee.com/zhang-tenglan/puzzlegame.git](https://gitee.com/zhang-tenglan/puzzlegame.git)
46 6
|
10月前
|
存储 安全 Java
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
116 1
|
10月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
|
10月前
|
Java 测试技术 C++
【JAVA学习之路 | 进阶篇】File类及常用方法
【JAVA学习之路 | 进阶篇】File类及常用方法

热门文章

最新文章