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

java中的Filter使用详解

Filter(过滤器)是 Java Web 开发的核心组件之一,用于在请求到达 Servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析:

在这里插入图片描述


一、Filter 的作用与原理

  1. 核心作用
    Filter 充当请求与响应之间的“中间层”,主要功能包括:

    • 请求预处理:如统一编码设置、敏感词过滤、权限校验。

    • 响应后处理:如压缩响应内容、添加安全头。

    • 资源拦截控制:根据规则限制对特定资源的访问(如登录校验)。

  2. 工作原理

    • 过滤器链:多个 Filter 按配置顺序形成链式处理,请求依次通过每个 Filter,响应则反向传递。

    • 拦截时机:可配置拦截请求类型(如 REQUESTFORWARD)。


二、Filter 的创建与配置

  1. 实现 Filter 接口
    需实现 javax.servlet.Filter 接口,并重写三个生命周期方法:

    public class AuthFilter implements Filter {@Overridepublic void init(FilterConfig config) { /* 初始化资源 */ }@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {// 请求处理逻辑(如权限检查)chain.doFilter(req, res); // 放行// 响应处理逻辑(如日志记录)}@Overridepublic void destroy() { /* 释放资源 */ }
    }
    
  2. 配置方式

    • XML 配置(web.xml):

      <filter><filter-name>AuthFilter</filter-name><filter-class>com.example.AuthFilter</filter-class>
      </filter>
      <filter-mapping><filter-name>AuthFilter</filter-name><url-pattern>/secure/*</url-pattern><dispatcher>REQUEST</dispatcher> <!-- 拦截请求类型 -->
      </filter-mapping>
      
    • 注解配置(推荐):

      @WebFilter(urlPatterns = {"/secure/*"}, initParams = {@WebInitParam(name = "param", value = "value")})
      public class AuthFilter implements Filter { /* ... */ }
      

三、Filter 的生命周期

  1. init() 方法

    • 触发时机:服务器启动时执行一次,用于加载初始化参数或资源(如数据库连接)。

    • 参数:FilterConfig 可获取配置信息(如 <init-param>)。

  2. doFilter() 方法

    • 核心逻辑:每次请求符合拦截路径时执行,需调用 chain.doFilter() 放行。

    • 拦截与修改:可在此修改请求/响应对象(如重写 HttpServletRequestWrapper)。

  3. destroy() 方法

    • 触发时机:服务器关闭时执行,用于释放资源(如关闭线程池)。

四、拦截路径配置详解

  1. URL 匹配模式
    • 精确匹配:/login 仅拦截该路径请求。

    • 目录匹配:/admin/* 拦截 /admin 下所有子路径。

    • 后缀匹配:*.jsp 拦截所有 JSP 请求。

    • 全局匹配:/* 拦截所有请求。

  2. 拦截类型(Dispatcher)
    REQUEST:直接请求(默认)。

    FORWARD:拦截转发请求(如 request.getRequestDispatcher().forward())。

    ERROR:拦截错误页面跳转。


五、多 Filter 执行顺序

  1. 配置顺序规则
    • XML 配置:按 <filter-mapping> 定义的顺序执行。

    • 注解配置:默认按类名字典序执行(不同容器可能有差异)。

  2. 示例流程

    请求 → Filter1 → Filter2 → Servlet → Filter2 → Filter1 → 响应
    

六、典型应用场景

  1. 统一编码设置

    public class EncodingFilter implements Filter {@Overridepublic void doFilter(...) {request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");chain.doFilter(request, response);}
    }
    
  2. 权限控制

    public class LoginFilter implements Filter {@Overridepublic void doFilter(...) {HttpSession session = ((HttpServletRequest) request).getSession();if (session.getAttribute("user") == null) {((HttpServletResponse) response).sendRedirect("/login");} else {chain.doFilter(request, response);}}
    }
    
  3. 日志记录与性能监控

    public class LogFilter implements Filter {@Overridepublic void doFilter(...) {long startTime = System.currentTimeMillis();chain.doFilter(request, response);long duration = System.currentTimeMillis() - startTime;System.out.println("请求耗时:" + duration + "ms");}
    }
    

七、注意事项

  1. 线程安全
    Filter 实例为单例,避免在类中定义成员变量(若需共享数据,使用 ThreadLocal)。

  2. 性能优化
    • 减少 doFilter() 中的阻塞操作(如远程调用),必要时结合异步处理。

    • 合理设置拦截路径,避免全局拦截导致性能下降。

  3. 异常处理
    doFilter() 中捕获异常,防止因未处理异常导致过滤器链中断。


总结

Filter 是 Java Web 开发中实现全局逻辑控制的核心工具,通过灵活配置拦截路径和类型,可高效完成编码转换、权限校验、日志记录等通用功能。合理设计过滤器链和执行顺序,能显著提升应用的可维护性和安全性。

相关文章:

java中的Filter使用详解

Filter&#xff08;过滤器&#xff09;是 Java Web 开发的核心组件之一&#xff0c;用于在请求到达 Servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析&#xff1a; 一、Filter 的作用与原理 核心作用 Filter 充当请求与响应之间的…...

PostgreSQL初体验

目录 一、PostgreSQL 核心概述 &#xff08;一&#xff09;定义与定位 &#xff08;二&#xff09;核心特性与优势 &#xff08;三&#xff09;应用场景 二、PostgreSQL 安装实战&#xff08;基于 OpenEuler 24&#xff09; &#xff08;一&#xff09;编译安装&#xff…...

css使用clip-path属性切割显示可见内容

1. 需求 想要实现一个渐变的箭头Dom&#xff0c;不想使用svg、canvas去画&#xff0c;可以考虑使用css的clip-path属性切割显示内容。 2. 实现 <div class"arrow">箭头 </div>.arrow{width: 200px;height: 60px;background-image: linear-gradient(45…...

新京东,正在成为一种生活方式

出品|何玺排版|叶媛 一个新京东&#xff0c;正在从“心”诞生。 2025年2月11日之前&#xff0c;如果问京东是做什么的&#xff0c;相信大多数人会回答京东是电商平台&#xff0c;卖家电数码日用百货的。现在&#xff0c;如果问京东是做什么的&#xff0c;相信大家的回答不在是…...

Linux 文件(2)

文章目录 1. 文件描述符1.1 文件描述符是什么1.2 文件描述符如何分配 2 重定向2.1 输出重定向2.2 输入重定向2.3 使用dup2进行重定向 3. 文件、父子进程和进程替换 1. 文件描述符 1.1 文件描述符是什么 什么是文件描述符呢&#xff1f; 我们先来看之前所介绍的系统级别的文件…...

分析 redis 的 exists 命令有一个参数和多个参数的区别

在 redis 中&#xff0c;exists 命令是用来查询某个或多个 key 是否存在的&#xff0c;返回存在的 key 的个数。 由于 redis 是按照键值对方式存储数据的&#xff0c;于是一个 key 只能对应一组数据&#xff0c;那么上述的 key 的个数指的即是需要查询的 key 中有几个 key 是存…...

《具身智能机器人:自修复材料与智能结构设计的前沿探索》

在具身智能机器人的研发进程中&#xff0c;自修复材料与智能结构设计无疑是极具挑战性与创新性的关键领域&#xff0c;吸引着无数科研人员投身其中&#xff0c;探寻未知。 传统机器人在复杂多变的环境中执行任务时&#xff0c;一旦材料出现损伤&#xff0c;如外壳刮擦、内部线…...

Java 10IO流

IO流 input输入 output输出场景1&#xff1a;读写配置文件、日志文件 场景2&#xff1a;客户端与服务端的通讯 场景3&#xff1a;文件上传和下载io流体系结构 字节流 万能流&#xff0c;适合除纯文本文件外的储存字符流 纯文本文件字节流 FileOutputStream字节输出流 构造…...

@ColorRes和@ColorInt什么区别

ColorRes 和 ColorInt 都是 Android 的注解&#xff08;Annotations&#xff09;&#xff0c;用于标记你传递的参数到底是什么类型的“颜色”信息——资源 ID 还是实际颜色值。 ✅ 一句话理解 注解代表含义举例通常用在ColorRes表示这是一个颜色资源 ID&#xff08;如 R.colo…...

基于Springboot + vue3实现的工商局商家管理系统

项目描述 本系统包含管理员、商家两个角色。 管理员角色&#xff1a; 用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。 许可证申请管理&#xff1a;管理商家的许可证申请&#xff0c;包括搜索、修改或删除许可证申请。 许可证审批管理…...

【Java ee初阶】HTTP(2)

一、HTTP的方法 方法 说明 支持的HTTP协议版本 GET 获取资源 1.0、1.1 POST 传输实体主体 1.0、1.1 PUT 传输文件 1.0、1.1 HEAD 获得报文首部 1.0、1.1 DELETE 删除文件 1.0、1.1 OPTIONS 询问支持的方法 1.1 TRACE 追踪路径 1.1 CONNECT 要求用隧道…...

idea本地debug断点小技巧

idea本地debug断点小技巧 简单的设置断点条件 断点后&#xff0c;右键这个断点&#xff0c;可以在 condition 中填写能得出布尔的表达式 a 1 你如果写如下&#xff0c;表示先给他赋值&#xff0c;然后断住 a 2; true 断点后设置某个变量的值 在 debug 区域可以设置变量…...

21. 自动化测试框架开发之Excel配置文件的测试用例改造

21. 自动化测试框架开发之Excel配置文件的测试用例改造 一、测试框架核心架构 1.1 组件依赖关系 # 核心库依赖 import unittest # 单元测试框架 import paramunittest # 参数化测试扩展 from chap3.po import * # 页面对象模型 from file_reader import E…...

避开封禁陷阱:动态IP在爬虫、跨境电商中的落地实践

​​1. 为什么需要动态IP&#xff1f;​​ 在日常网络操作中&#xff0c;你是否遇到过&#xff1a; ​​爬虫被封​​&#xff1a;频繁请求目标网站&#xff0c;IP被限制访问。​​跨境业务受限​​&#xff1a;某些平台对特定地区的账号有限制。​​数据采集失败​​&#x…...

python-leetcode 69.最小栈

题目&#xff1a; 设计一个支持push,pop,top,操作&#xff0c;并能在常数时间内检索到最小元素的栈。 辅助栈法&#xff1a; 1&#xff1a;使用两个栈&#xff0c;一个主栈用于存储所有元素&#xff0c;另一个辅助栈用于存储当前元素的最小值 2: 每次push时&#xff0c;将元…...

YOLO中model.predict方法返回内容Results详解

1.执行代码 resultsmodel.predict(YOLO/ultralytics/assets/zidane.jpg) print(results) 结果如下&#xff1a; 可以看出结果是一个数组形式&#xff0c;数组里每个元素都是Ultralytics的Results对象 1&#xff09;为什么结果是数组&#xff0c;而不是单个对象&#xff1f; …...

CF每日4题(1300-1400)

2026B 贪心 1300 我的思路和dalao很像 void solve(){int n;cin>>n;vector<int>a(n1);forr(i,1,n)cin>>a[i];int fg(n&1),ans;if(fg){ans1e1810;forr(i,1,n){//枚举把一个数去掉&#xff0c;其他两两组合int tmp1,j1;while (j<n){if(ji)j;int prea[j…...

golang学习大全

GO全路线学习&#xff08;总结&#xff09;大全 主题一 go语言基础知识讲解 go语言面向对象编程 go语言接口详解 go语言协程 主题二 web基础知识 构建web服务器 后续内容请大家持续关注&#xff0c;每月一主题&#xff0c;让各位读者能零基础、零成本学习go语言&#xff0c;我…...

falsk模型-flask_sqlalchemy增删改查

1、增、删、改 增 home_bp.route(/useradd) def user_add():users []for i in range(10,20):user User()user.name 冰冰 str(i)user.age 20iusers.append(user)try:db.session.add_all(users)db.session.commit()return jsonify({code:1,info:success})except Exception…...

K8S详解(5万字详细教程)

目录 一、集群管理命令 二、命名空间 1. 获取命名空间列表 2. 创建命名空间 3. 删除命名空间 4. 查看命名空间详情 三、Pod 1. Pod概述 2. Pod相位状态 3. 管理命令 3.1 获取命名空间下容器(pod)列表 3.2 查看pod的详细信息 3.3 创建 && 运行 3.4 删除pod …...

STL编程之vector

vector的基础概念&#xff1a;类 #include<iostream> #include<vector> using namespace std;int main() {int a[6] {1,2,4,5,6,7};vector<int> v { 1,3,6,8 };cout << v.capacity() << endl;v.push_back(8);cout << v.capacity() <…...

BI是什么意思?一文讲清BI的概念与应用!

目录 一、BI 是什么意思 1. BI 的定义 2. BI 的发展历程 3. BI 的核心组件 二、BI 的应用场景 1. 销售与市场营销 2. 财务管理 ​编辑3. 人力资源管理 4. 生产与运营管理 ​编辑三、选择合适的 BI 工具 1. 考虑企业的需求和规模 2. 评估工具的功能和性能 3. 关注工…...

[ 计算机网络 ] 深入理解TCP/IP协议

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…...

微软开放代理网络愿景

&#x1f310; Microsoft的开放式智能代理网络愿景 2025年05月20日 | AI日报 ![](https://i-blog.csdnimg.cn/direct/e7838b88f17f40c9a435f6dc48d26c59.jpeg#pic_center) 欢迎各位人工智能爱好者 微软刚刚在Build 2025大会上开启了备受期待的AI周活动&#xff0c;通过发布大…...

UDP三种通信方式

单播&#xff08;Unicast&#xff09; 单播是最常见的通信方式&#xff0c;数据从一个发送方传输到一个特定的接收方。发送方将数据包发送到接收方的IP地址和端口号&#xff0c;接收方通过监听指定的端口接收数据。单播适用于一对一的通信场景。 import java.net.DatagramPac…...

4-5月份,思科,华为,微软,个别考试战报分享

一定要看正版学习资料&#xff0c;在资料上省的钱可能变成后面的补考费&#xff0c;#网络工程师 #华为考试题库 #HCIP题库 #HCIA题库 #HCSP题库 #HCSE题库 #HCSA题库 #华为电力题库 #华为金融题库 #正版题库#思科考试 #CCNP题库 #CCNA题库 #HCIA考试 #CCIE题库 #CCDE题库 #电信…...

计算机网络-HTTP与HTTPS

文章目录 计算机网络网络模型网络OSITCP/IP 应用层常用协议HTTP报文HTTP状态码HTTP请求类型HTTP握手过程HTTP连接HTTP断点续传HTTPSHTTPS握手过程 计算机网络 网络模型 为了解决多种设备能够通过网络相互通信&#xff0c;解决网络互联兼容性问题。 网络模型是计算机网络中用于…...

信号波形发生器电路Multisim仿真

一、电路 二、示波器 三、示波器波形 四、所遇到的问题 1、只是把电路仿真出来了&#xff0c;具体原理没有理解。 解&#xff1a; 第一个波形是正弦波&#xff0c;是由电阻和电容的振荡电路产生的。 第二个波形是方波&#xff0c;产生的正弦波通过电压比较器输出一个方波。…...

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践

深入解析Java微服务架构&#xff1a;Spring Boot与Spring Cloud的整合实践 引言 随着云计算和分布式系统的快速发展&#xff0c;微服务架构已成为现代软件开发的主流模式。Java作为企业级应用开发的核心语言&#xff0c;结合Spring Boot和Spring Cloud的强大生态&#xff0c;…...

医学影像辅助诊断系统开发教程-基于tensorflow实现

源码下载地址: https://download.csdn.net/download/shangjg03/90873910 1. 简介 医学影像辅助诊断系统是利用计算机视觉和深度学习技术,帮助医生分析医学影像(如X光、CT、MRI等)并提供诊断建议的系统。本教程将指导你开发一个基于深度学习的胸部X光肺炎检测系统。 2. 准备…...