java中的Filter使用详解

news2025/5/21 7:15:57

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

在这里插入图片描述


一、Filter 的作用与原理

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

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

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

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

  2. 工作原理

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

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


二、Filter 的创建与配置

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

    public class AuthFilter implements Filter {
        @Override
        public void init(FilterConfig config) { /* 初始化资源 */ }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
            throws IOException, ServletException {
            // 请求处理逻辑(如权限检查)
            chain.doFilter(req, res); // 放行
            // 响应处理逻辑(如日志记录)
        }
    
        @Override
        public 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 {
        @Override
        public void doFilter(...) {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            chain.doFilter(request, response);
        }
    }
    
  2. 权限控制

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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; 我们先来看之前所介绍的系统级别的文件…

基于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…

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; …

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;通过发布大…

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;产生的正弦波通过电压比较器输出一个方波。…

Spring AI 介绍

Python一直是AI领域的主要语言, 主要原因是因其语法简洁易学、拥有丰富且强大的AI专用库及框架、具备跨平台兼容性且社区生态活跃,能高效支撑AI算法开发、数据处理及模型部署。 Spring开发了AI开发的框架Spring AI,对于Java的开发者来说,也可以快速入手AI相关的开发了。 S…

onlyoffice 源码 调试说明 -ARM和x86双模式安装支持

很多用户在调试onlyoffice源码最大的问题是如何搭建环境,这个难度很高,下面提供一键安装的方式,让普通用户也能快速调试源码。 OnlyOffice Document Server 基于源码运行的容器调试模式&#xff0c;凭借 Docker 容器化技术的核心优势&#xff0c;为开发者提供了跨平台、高兼容性…

EXCEL在一列数据前统一添加负号

1.全选数据列 2.右键&#xff0c;设置单元格格式。输入-0&#xff0c;要保留三位小数就输入-0.000. 3.添加完成效果。