当前位置: 首页 > news >正文

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&#xff1f; 依据字面上的中文意思为过滤器。Filter的作用 当用户的请求到达指定的URL之前&#xff0c;可以借助Filter来改变这些请求的内容&#xff1b;同样地&#xff0c;当响应结果到达客户端之前&#xff0c;可以使用Filter修改输出的内容。什么…...

【iOS】KVC的学习

【iOS】KVC的学习 文章目录 【iOS】KVC的学习前言KVC定义KVC设值KVC取值KVC使用keyPathKVC处理异常处理nil异常 KVC的一些应用修改动态的设置值实现高阶的消息传递 小结 前言 笔者简单学习了有关与KVC的相关内容&#xff0c;这里写一篇博客简单介绍一下相关内容。 KVC 定义 KV…...

影刀RPA实战:网页爬虫之药品数据

1 实战目标 这次给大家带来的实战示例是采集中国医药信息平台上的药品数据&#xff0c;主要获取药品名称&#xff0c;介绍&#xff0c;药品类型&#xff0c;处方类型&#xff0c;医保类型&#xff0c;参考价格&#xff0c;药品成分&#xff0c;性状&#xff0c;适应病症&#…...

python禁止位置传参函数

这种函数定义方式使用了 Python 3.x 中的关键字参数&#xff08;keyword-only arguments&#xff09;的特性&#xff0c;通过在参数列表中使用 * 符号作为分隔符&#xff0c;来明确指示该函数之后的参数必须使用关键字&#xff08;即参数名&#xff09;来传递&#xff0c;而不能…...

java面试题第一弹

Java 的基本数据类型有哪些&#xff1f; Java 的基本数据类型&#xff08;primitive data types&#xff09;包括以下八种&#xff1a; byte&#xff1a; 尺寸&#xff1a;1 字节&#xff08;8 位&#xff09;。范围&#xff1a;-128 到 127。用途&#xff1a;节省内存&#x…...

住宅HTTP代理:提升网络隐私与安全的新选择

在互联网时代&#xff0c;我们的在线隐私和安全变得越来越重要。无论是浏览网页、进行在线交易&#xff0c;还是访问受限内容&#xff0c;住宅HTTP代理都能为我们提供一种可靠的解决方案。今天&#xff0c;我们就来深入探讨一下住宅HTTP代理&#xff0c;看看它是如何帮助我们提…...

字符串函数(2)

目录 前言1. strlen1.1 strlen函数的理解和使用1.2 strlen函数的模拟实现 2. strcpy2.1 strcpy函数的理解和使用2.2 strcpy函数的模拟实现 3.strcat3.1 strcat函数的理解和使用3.2 strcat 函数的模拟实现 前言 在上一篇文章中&#xff0c;我们对字符分类函数和字符转换函数进行…...

Linux--守护进程与会话

进程组 概念 进程组就是一个或多个进程的集合。 一个进程组可以包含多个进程。 下面我们通过一句简单的命令行来展示&#xff1a; 为什么会有进程组&#xff1f; 批量操作&#xff1a;进程组允许将多个进程组织在一起&#xff0c;形成一个逻辑上的整体。当需要对多个进程…...

C++ 笔试常用算法模板

C 笔试常用算法模板 一、二叉树遍历DFSBFS 二、回溯模板三、动态规划01背包朴素版本滚动数组优化 完全背包朴素版本滚动数组优化 最长递增子序列朴素版本贪心二分优化 最长公共子序列最长回文子串 四、图建图邻接矩阵邻接表 图的遍历DFSBFS 拓扑排序并查集最小生成树Kruskalpri…...

李宏毅2023机器学习作业HW07解析和代码分享

ML2023Spring - HW7 相关信息&#xff1a; 课程主页 课程视频 Kaggle link 回来了 : ) Sample code HW07 视频 HW07 PDF 个人完整代码分享: GitHub | Gitee | GitCode P.S. HW7 的代码都很易懂&#xff0c;可以和 2024 年的新课&#xff1a;生成式AI导论做一个很好的衔接&#…...

ansible远程自动化运维、常用模块详解

一、ansible是基于python开发的配置管理和应用部署工具&#xff1b;也是自动化运维的重要工具&#xff1b;可以批量配置、部署、管理上千台主机&#xff1b;只需要在一台主机配置ansible就可以完成其它主机的操作。 1.操作模式&#xff1a; 模块化操作&#xff0c;命令行执行…...

【若依框架】按时间查询数据的操作

【若依框架】按时间查询数据的操作 若依框架按起止时间查询数据示例&#xff1a; Date tempDate DateUtil.offsetDay(new Date(), -days);Map<String, Object> map new HashMap<>();map.put("beginRecordTime", DateUtil.beginOfHour(tempDate));map.…...

人工智能将来好就业吗?

人工智能将来好就业吗? 随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐成为推动全球经济发展的核心力量之一。从智能机器人到自动驾驶汽车&#xff0c;从语音识别到图像分析&#xff0c;AI正在改变我们的工作方式以及我们与世界的互动方式。那么&am…...

JAVA SE 11

文章目录 JDK 11 特性介绍语法增强1. String类的增强2. Optional类的增强3. 新的HTTP/2客户端4. var关键字的扩展5. Collection接口的增强 语法改进JDK 11引入的一些语法改进 详细介绍1. 模块化系统&#xff08;Java平台模块系统&#xff0c;JPMS&#xff09;2. HTTP客户端3. 改…...

【MySQ】在MySQL里with 的用法

在MySQL中&#xff0c;WITH语句通常与公用表表达式&#xff08;Common Table Expressions&#xff0c;简称CTE&#xff09;一起使用。CTE是一种临时的结果集&#xff0c;类似于视图或子查询&#xff0c;它们在查询中被定义并且可以在一个或多个SELECT、INSERT、UPDATE或DELETE语…...

多源最短路径

文章目录 1. 01 矩阵&#xff08;542&#xff09;2. 飞地的数量&#xff08;1020&#xff09;3. 地图分析&#xff08;1162&#xff09;4. 地图中的最高点&#xff08;1765&#xff09; 1. 01 矩阵&#xff08;542&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 这…...

在 Mac 中设置环境变量

目录 什么是环境变量&#xff0c;为什么它们重要&#xff1f;什么是环境变量&#xff1f;举个例子 如何查看环境变量如何设置和修改环境变量1. 临时设置环境变量2. 永久设置环境变量3. 修改现有环境变量 环境变量在开发中的应用在 Node.js 项目中使用环境变量在 Python 项目中使…...

记录一次ubuntu /mysql/redis/nginx等 系统安装

没想到还会做一次系统安装配置类的工作&#xff0c;没办法&#xff0c;碰到问题了&#xff0c;总得解决。 安装 &网络配置 从网上下载了ubuntu 18.04.6的安装包&#xff0c;用UltraISO做安装盘&#xff0c;到服务器上修改了下启动顺序&#xff0c;ubuntu的安装非常简单&a…...

大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元

Sysdig 威胁研究团队 (TRT) 报告称&#xff0c;LLMjacking&#xff08;大型语言模型劫持&#xff09;事件急剧增加&#xff0c;攻击者通过窃取的云凭证非法访问大型语言模型 (LLM)。 这一趋势反映了 LLM 访问黑市的不断增长&#xff0c;攻击者的动机包括个人使用和规避禁令和制…...

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器

文章目录 垃圾回收机制Stop-the-World垃圾收集器垃圾收集器分类Serial 收集器Serial Old 收集器ParNew 收集器Parallel Scavenge 收集器Parallel Old 收集器CMS 收集器CMS 收集器缺点 G1 收集器G1 收集器特点G1 收集器的分代理念G1 收集器运作过程 垃圾回收机制 垃圾回收&…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...