JavaWeb的Filter详解
过滤器Filter
- 什么是Filter?
- 依据字面上的中文意思为过滤器。
- Filter的作用
- 当用户的请求到达指定的URL之前,可以借助Filter来改变这些请求的内容;同样地,当响应结果到达客户端之前,可以使用Filter修改输出的内容。
- 什么是FilterChain(过滤器链)?
- 一个FilterChain包含多个Filter。

Filter编程
过滤器的工作原理

过滤器的生命周期

过滤器的部署
在web.xml中配置如下:
<filter><filter-name>Logger</filter-name><filter-class>com.util.LoggerFilter</filter-class>
</filter><filter-mapping><filter-name>Logger</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
示例:
<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> <filter-name>exampleFilter</filter-name> <!-- Filter的名称 --> <filter-class>com.example.ExampleFilter</filter-class> <!-- Filter的实现类 --> <!-- 初始化参数(可选) --> <init-param> <param-name>paramName</param-name> <param-value>paramValue</param-value> </init-param> <!-- 其他初始化参数(如果有的话)... --> </filter> <!-- Filter映射 --> <filter-mapping> <filter-name>exampleFilter</filter-name> <!-- 与上面定义的Filter的名称相对应 --> <url-pattern>/*</url-pattern> <!-- 指定Filter应用的URL模式,/* 表示应用于所有请求 --> <!-- 也可以指定多个<url-pattern>,或者使用<servlet-name>来指定应用于哪些Servlet --> <!-- 其他可选属性,如<dispatcher>,可以指定在哪些类型的请求上应用此Filter,如REQUEST、FORWARD、INCLUDE、ERROR等 --> </filter-mapping> <!-- Servlet和其他配置... --> </web-app>
- 在这个例子中,
filter元素定义了一个名为exampleFilter的过滤器,其实现类是com.example.ExampleFilter。- 你可以在这个元素内部添加
<init-param>元素来定义过滤器的初始化参数,这些参数可以在过滤器的init方法(如果覆盖了Filter接口的init(FilterConfig filterConfig)方法)中通过FilterConfig对象访问。filter-mapping元素定义了过滤器的映射信息,即指定了过滤器应该应用于哪些URL模式或Servlet。在这个例子中,<url-pattern>/*</url-pattern>表示过滤器将应用于Web应用中的所有请求。你也可以通过指定具体的URL模式或Servlet名称来限制过滤器的应用范围。注意:在servlet3.0版本以上,我们可以直接使用注解的方式快速定义一个过滤器
Filter接口
过滤器是一个对象,它根据用户的请求和资源的响应进行过滤.
Filter接口包含以下方法:

FilterConfig
FilterConfig是一个接口,它主要用于在过滤器(Filter)的初始化阶段,从web.xml配置文件中获取与过滤器相关的参数信息。
| 方法名 | 方法描述 |
|---|---|
getInitParameter(String name) | 返回在部署描述符(web.xml)文件中指定名称的初始化参数的值。如果找不到该参数,则返回null。 |
getInitParameterNames() | 返回一个枚举集合,包含过滤器的所有初始化参数的名字。如果过滤器没有初始化参数,则返回一个空的枚举集合。 |
getFilterName() | 返回过滤器在web.xml中声明的名称。 |
getServletContext() | 返回表示Servlet上下文的ServletContext对象的引用。 |
过滤器的应用场合
- 加载:对于到达系统的所有请求,过滤器收集诸如浏览器类型,一天中的时间等相关信息,并对它们进行日志记录
- 性能:过滤器在内容通过线路传来并在到达Servlet和JSP页面之前解压缩该内容,然后再取得响应内容,并在响应内容发送到客户机器之前将它转换为压缩格式
- 安全:过滤器处理身份验证令牌的管理,并适当地限制安全资源的访问,提示用户进行身份验证或将它们指引到第三方进行身份验证.
- 会话管理:将Servlet和JSP页面与会话处理代码混杂在一起可能带来相当大的麻烦.使用过滤器来管理会话可以让WEB页面集中精力考虑内容显示和委托处理,而不必担心会话管理的细节.
Filter经典案例
字符集处理
定义类EncodingFilter实现Filter接口,重写doFilter()方法。
过滤器类
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//设置请求字符集request.setCharacterEncoding("GBK");//请求向下传递chain.doFilter(request, response);
}
web.xml配置
<filter><filter-name>EncodingFilter</filter-name><filter-class>com.javaweb.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping><filter-name>EncodingFilter</filter-name><!-- 过滤所有请求 --><url-pattern>/*</url-pattern>
</filter-mapping>
登陆验证
解决把登录信息放入session会产生大量重复代码的问题
过滤器类
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpSession session = req.getSession();// 从session中获取用户信息User user = (User) session.getAttribute("user");// 能够从session获取到用户信息,代表用户已经成功登陆过if (user != null) {// 请求向下传递chain.doFilter(request, response);} else {//如果获取不到用户信息,代表用户没有登陆,则转向到登陆页面req.getRequestDispatcher("/login.jsp").forward(request, response);}}
FilterChain过滤链
一个过滤器链(FilterChain),在请求到达请求资源前会依次经过链中的所有过滤器,<filter-mapping>配置在前的Filter先执行,而请求处理完成后,会按照相反的顺序再次经过链中的所有过滤器。
总结
- Filter用于对request或者response进行修改。
- 可以使用Filter处理一些通用的业务操作:
- 字符集编码
- 权限验证
- session管理
- 日志记录
- 响应格式设置
相关文章:
JavaWeb的Filter详解
过滤器Filter 什么是Filter? 依据字面上的中文意思为过滤器。Filter的作用 当用户的请求到达指定的URL之前,可以借助Filter来改变这些请求的内容;同样地,当响应结果到达客户端之前,可以使用Filter修改输出的内容。什么…...
【iOS】KVC的学习
【iOS】KVC的学习 文章目录 【iOS】KVC的学习前言KVC定义KVC设值KVC取值KVC使用keyPathKVC处理异常处理nil异常 KVC的一些应用修改动态的设置值实现高阶的消息传递 小结 前言 笔者简单学习了有关与KVC的相关内容,这里写一篇博客简单介绍一下相关内容。 KVC 定义 KV…...
影刀RPA实战:网页爬虫之药品数据
1 实战目标 这次给大家带来的实战示例是采集中国医药信息平台上的药品数据,主要获取药品名称,介绍,药品类型,处方类型,医保类型,参考价格,药品成分,性状,适应病症&#…...
python禁止位置传参函数
这种函数定义方式使用了 Python 3.x 中的关键字参数(keyword-only arguments)的特性,通过在参数列表中使用 * 符号作为分隔符,来明确指示该函数之后的参数必须使用关键字(即参数名)来传递,而不能…...
java面试题第一弹
Java 的基本数据类型有哪些? Java 的基本数据类型(primitive data types)包括以下八种: byte: 尺寸:1 字节(8 位)。范围:-128 到 127。用途:节省内存&#x…...
住宅HTTP代理:提升网络隐私与安全的新选择
在互联网时代,我们的在线隐私和安全变得越来越重要。无论是浏览网页、进行在线交易,还是访问受限内容,住宅HTTP代理都能为我们提供一种可靠的解决方案。今天,我们就来深入探讨一下住宅HTTP代理,看看它是如何帮助我们提…...
字符串函数(2)
目录 前言1. strlen1.1 strlen函数的理解和使用1.2 strlen函数的模拟实现 2. strcpy2.1 strcpy函数的理解和使用2.2 strcpy函数的模拟实现 3.strcat3.1 strcat函数的理解和使用3.2 strcat 函数的模拟实现 前言 在上一篇文章中,我们对字符分类函数和字符转换函数进行…...
Linux--守护进程与会话
进程组 概念 进程组就是一个或多个进程的集合。 一个进程组可以包含多个进程。 下面我们通过一句简单的命令行来展示: 为什么会有进程组? 批量操作:进程组允许将多个进程组织在一起,形成一个逻辑上的整体。当需要对多个进程…...
C++ 笔试常用算法模板
C 笔试常用算法模板 一、二叉树遍历DFSBFS 二、回溯模板三、动态规划01背包朴素版本滚动数组优化 完全背包朴素版本滚动数组优化 最长递增子序列朴素版本贪心二分优化 最长公共子序列最长回文子串 四、图建图邻接矩阵邻接表 图的遍历DFSBFS 拓扑排序并查集最小生成树Kruskalpri…...
李宏毅2023机器学习作业HW07解析和代码分享
ML2023Spring - HW7 相关信息: 课程主页 课程视频 Kaggle link 回来了 : ) Sample code HW07 视频 HW07 PDF 个人完整代码分享: GitHub | Gitee | GitCode P.S. HW7 的代码都很易懂,可以和 2024 年的新课:生成式AI导论做一个很好的衔接&#…...
ansible远程自动化运维、常用模块详解
一、ansible是基于python开发的配置管理和应用部署工具;也是自动化运维的重要工具;可以批量配置、部署、管理上千台主机;只需要在一台主机配置ansible就可以完成其它主机的操作。 1.操作模式: 模块化操作,命令行执行…...
【若依框架】按时间查询数据的操作
【若依框架】按时间查询数据的操作 若依框架按起止时间查询数据示例: Date tempDate DateUtil.offsetDay(new Date(), -days);Map<String, Object> map new HashMap<>();map.put("beginRecordTime", DateUtil.beginOfHour(tempDate));map.…...
人工智能将来好就业吗?
人工智能将来好就业吗? 随着科技的不断进步,人工智能(AI)正逐渐成为推动全球经济发展的核心力量之一。从智能机器人到自动驾驶汽车,从语音识别到图像分析,AI正在改变我们的工作方式以及我们与世界的互动方式。那么&am…...
JAVA SE 11
文章目录 JDK 11 特性介绍语法增强1. String类的增强2. Optional类的增强3. 新的HTTP/2客户端4. var关键字的扩展5. Collection接口的增强 语法改进JDK 11引入的一些语法改进 详细介绍1. 模块化系统(Java平台模块系统,JPMS)2. HTTP客户端3. 改…...
【MySQ】在MySQL里with 的用法
在MySQL中,WITH语句通常与公用表表达式(Common Table Expressions,简称CTE)一起使用。CTE是一种临时的结果集,类似于视图或子查询,它们在查询中被定义并且可以在一个或多个SELECT、INSERT、UPDATE或DELETE语…...
多源最短路径
文章目录 1. 01 矩阵(542)2. 飞地的数量(1020)3. 地图分析(1162)4. 地图中的最高点(1765) 1. 01 矩阵(542) 题目描述: 算法原理: 这…...
在 Mac 中设置环境变量
目录 什么是环境变量,为什么它们重要?什么是环境变量?举个例子 如何查看环境变量如何设置和修改环境变量1. 临时设置环境变量2. 永久设置环境变量3. 修改现有环境变量 环境变量在开发中的应用在 Node.js 项目中使用环境变量在 Python 项目中使…...
记录一次ubuntu /mysql/redis/nginx等 系统安装
没想到还会做一次系统安装配置类的工作,没办法,碰到问题了,总得解决。 安装 &网络配置 从网上下载了ubuntu 18.04.6的安装包,用UltraISO做安装盘,到服务器上修改了下启动顺序,ubuntu的安装非常简单&a…...
大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元
Sysdig 威胁研究团队 (TRT) 报告称,LLMjacking(大型语言模型劫持)事件急剧增加,攻击者通过窃取的云凭证非法访问大型语言模型 (LLM)。 这一趋势反映了 LLM 访问黑市的不断增长,攻击者的动机包括个人使用和规避禁令和制…...
Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器
文章目录 垃圾回收机制Stop-the-World垃圾收集器垃圾收集器分类Serial 收集器Serial Old 收集器ParNew 收集器Parallel Scavenge 收集器Parallel Old 收集器CMS 收集器CMS 收集器缺点 G1 收集器G1 收集器特点G1 收集器的分代理念G1 收集器运作过程 垃圾回收机制 垃圾回收&…...
解决企业知识孤岛挑战:Outline多平台文档迁移架构与技术实现方案
解决企业知识孤岛挑战:Outline多平台文档迁移架构与技术实现方案 【免费下载链接】outline Outline 是一个基于 React 和 Node.js 打造的快速、协作式团队知识库。它可以让团队方便地存储和管理知识信息。你可以直接使用其托管版本,也可以自己运行或参与…...
探索Lumerical建模计算可调谐光学手性
Lumerical建模计算可调谐光学手性在光学领域,可调谐光学手性是一个极具吸引力的研究方向。而Lumerical作为一款强大的光学仿真软件,为我们深入探究这一领域提供了有力工具。 什么是可调谐光学手性 光学手性简单来说,描述的是光与物质相互作用…...
React Native vs Flutter:一次深入到底的性能对比分析(含原理 + 实战)
目录 一、先说结论(避免踩坑) 二、架构对比:性能差异的根源 1. React Native 架构 关键点: 2. Flutter 架构 关键点: 3. 核心差异总结 三、性能对比核心维度 四、启动性能(App Launch Time&#x…...
Java毕业设计基于springboot+vue的校内兼职信息管理系统
前言 Spring Boot 校内兼职信息管理系统是以 Spring Boot 框架为核心搭建的,专门用于高效管理校园内各类 兼职信息的平台。随着校园生活的多元化发展,学生对兼职机会的需求日益增长,传统的兼职信息发布与管理方式杂乱无章,存在信息…...
3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南
3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 一、为什么你需要专业的资源嗅探工具? 场景化痛点直击 作为…...
把 SAP Fiori 远程系统配置讲透:SM59、System Alias、sap-system 与多后端路由实践
在 SAP Fiori launchpad 的真实项目里,用户登录的系统,和应用实际运行、实际取数的系统,往往并不是同一台机器。很多团队在做 PoC 的时候,一切看起来都很顺;一旦进入企业级部署,前端服务器、Gateway、ECC、S/4HANA、SRM 甚至多个区域性后端同时出现,导航失败、取数跑偏、…...
突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册
突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的革命性插件框架&…...
为什么选择yfinance:3步实现免费金融数据获取的完整解决方案
为什么选择yfinance:3步实现免费金融数据获取的完整解决方案 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance 在金融数据分析的世界里,你是否曾为获取高质…...
可视化是对比原始数据和填补数据的强大工具。你可以使用箱线图、密度图或散点图来可视化原始数据和填补后的数据
下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文5665字)。 2篇2章6节:R的多重填补法中随机回归填补法的应用,MICE包的实际应用和统计与可视化评估-CSDN博客 在数据分析中,缺失数据是常见且具有挑战性…...
DAMOYOLO-S与数据库联动:检测结果实时入库与查询
DAMOYOLO-S与数据库联动:检测结果实时入库与查询 你有没有想过,当AI模型在摄像头前“看到”一个人、一辆车时,这些信息除了在屏幕上显示一下,还能做什么?如果这些“看见”的瞬间——谁、在哪儿、什么时候、有多确定—…...
