Java安全
Java 基础知识
01概述
02变量
03运算符
04程序控制语句
05数组
06面向对象编程
07代码练习
08重载
09作用域
10构造方法&构造器
11this
12包
13修饰符
14封装
15继承
16super
17覆盖&重写
18多态
19零钱通项目
20类变量&类方法
21抽象类
22接口
23内部类
24枚举
25泛型
26常用API
27lambda表达式
28正则表达式
29异常
30File&IO流
31日志技术
32多线程
33网络编程
01反射
02反序列化
03JVM
04JDBC
05RMI
06JRMP
07JNDI
08CDI
09JPA
10Servlet
11Filter
12MVC模型
13MVC框架
14类的加载机制
15Maven
16注解
17ORM
18CC链
19JNDI注入
Log4j2
-
+
首页
11Filter
## 概述 在 Java Web 开发中,Filter(过滤器) 是一种用于拦截和处理 HTTP 请求 / 响应的组件,它可以在请求到达 Servlet 之前进行预处理,或在响应返回客户端之前进行后处理,常用于实现通用功能(如字符编码转换、登录验证、日志记录等) ## 定位 Filter 的核心是 “拦截” 与 “增强”,它不直接生成响应,而是对请求 / 响应进行加工后,传递给后续组件(如其他 Filter 或 Servlet)。 具体作用包括: - 请求预处理:如验证用户是否登录、过滤非法参数、设置字符编码(解决中文乱码)等; - 响应后处理:如修改响应内容、添加统一响应头(如缓存控制)等; - 资源访问控制:如限制特定 IP 的访问、拦截敏感路径的请求等。 ## 生命周期 | 阶段 | 触发时机 | 核心方法 | 作用 | | ------ | ------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | 初始化 | Web 容器启动时(或 Filter 第一次被调用时) | void init(FilterConfig config) | 执行初始化操作(如读取配置参数),整个生命周期仅执行一次。 | | 过滤 | 每次请求匹配 Filter 的 URL 模式时 | void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) | 核心过滤逻辑:处理请求 / 响应后,通过chain.doFilter()将请求传递给下一个组件(Filter 或 Servlet)。 | | 销毁 | Web 容器关闭时(或 Filter 被移除时) | void destroy() | 执行资源清理操作(如释放连接、关闭流),整个生命周期仅执行一次。 | ## 工作流程 ### 核心接口 Filter 基于jakarta.servlet.Filter接口实现,该接口定义了生命周期方法: - init(FilterConfig):初始化; - doFilter(ServletRequest, ServletResponse, FilterChain):执行过滤; - destroy():销毁。 ### 工作流程-Filter 链 当请求匹配多个 Filter 的 URL 模式时,这些 Filter 会形成Filter 链,按顺序执行: 1. 客户端发送请求到 Web 容器; 2. 容器根据 URL 匹配第一个 Filter,调用其doFilter方法; 3. 第一个 Filter 处理后,通过FilterChain.doFilter()将请求传递给第二个 Filter; 4. 依次执行所有 Filter 后,请求到达目标 Servlet; 5. Servlet 处理请求并生成响应,响应按相反顺序经过 Filter 链(后处理); 6. 最终响应返回给客户端。  ## 配置方式 ### 基于 XML 配置(web.xml) ```xml <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" version="5.0"> <!-- 注册Filter --> <filter> <filter-name>EncodingFilter</filter-name> <!-- Filter名称 --> <filter-class>com.example.EncodingFilter</filter-class> <!-- Filter类全限定名 --> <!-- 配置初始化参数(可选) --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- 配置拦截的URL模式 --> <filter-mapping> <filter-name>EncodingFilter</filter-name> <!-- 关联的Filter名称 --> <url-pattern>/*</url-pattern> <!-- 拦截所有请求(/*表示所有路径) --> <!-- 可选:指定拦截的HTTP方法(如GET/POST) --> <dispatcher>REQUEST</dispatcher> <!-- 默认:拦截直接请求 --> </filter-mapping> </web-app> ``` ### 基于注解配置 通过@WebFilter注解直接在 Filter 类上配置: ```java import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.annotation.WebInitParam; // 注解配置:urlPatterns指定拦截的URL,initParams配置初始化参数 @WebFilter( urlPatterns = "/*", // 拦截所有请求 initParams = {@WebInitParam(name = "encoding", value = "UTF-8")} ) public class EncodingFilter implements Filter { // 实现过滤逻辑... } ``` ## 代码示例 实现字符编码 Filter(解决中文乱码),最典型的 Filter 应用是统一设置请求 / 响应的字符编码,避免中文乱码: ```java import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.annotation.WebInitParam; import java.io.IOException; // 拦截所有请求,初始化参数指定编码为UTF-8 @WebFilter( urlPatterns = "/*", initParams = {@WebInitParam(name = "encoding", value = "UTF-8")} ) public class EncodingFilter implements Filter { private String encoding; // 初始化:读取配置的编码参数 @Override public void init(FilterConfig filterConfig) throws ServletException { encoding = filterConfig.getInitParameter("encoding"); if (encoding == null) { encoding = "UTF-8"; // 默认值 } } // 过滤逻辑:设置请求和响应的编码 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 预处理:设置请求编码(解决POST请求中文乱码) request.setCharacterEncoding(encoding); // 设置响应编码(解决响应中文乱码) response.setContentType("text/html;charset=" + encoding); // 将请求传递给下一个Filter或Servlet chain.doFilter(request, response); // 后处理:可在此修改响应(如添加统一响应头) // response.setHeader("X-Powered-By", "Java Filter"); } // 销毁:无资源需要清理,空实现 @Override public void destroy() {} } ```
毛林
2025年10月27日 21:00
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码