一、过滤器是什么?
统一处理所有请求 / 响应,不用每个 Servlet 都写重复代码!
Servlet 过滤器 = 服务器端的 "门卫 / 拦截器"
- 它在 请求到达 Servlet 之前 先拦截
- 也可以在 响应返回客户端之前 再处理
- 可以对请求、响应、会话做统一处理
- 一个项目可以配多个过滤器,形成过滤链
二、过滤器能做什么?
- 统一编码设置(解决中文乱码)
- 登录校验(未登录不能访问)
- 权限控制
- 日志记录
- 请求 / 响应内容修改
- 压缩响应、跨域处理
三、过滤器核心接口
过滤器必须实现:javax.servlet.Filter接口
注意:必须重写 3 个方法:
- init():初始化(服务器启动时执行一次)
- doFilter() :核心过滤方法(每次请求都走这里)
- destroy():销毁(服务器关闭时执行)
四、过滤器执行流程(超级重要)

chain.doFilter(request, response)
- 这行代码 = 放行,让请求继续往后走
- 不写这行 = 拦截,请求到此为止
五、过滤器应用
1、统一编码过滤器(解决中文乱码)
java
package org.hlx.javaweb3_0323;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author : HLX
* @ClassName :CharacterFilter
* @date : 2026/3/24 9:26
* @Version :1.0
* @Description: TODO
* @modyified By :
*/
@WebFilter(urlPatterns = "/*", initParams = {@jakarta.servlet.annotation.WebInitParam(name = "encoding", value = "UTF-8")})
public class CharacterFilter implements Filter {
// 获取初始化参数
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获取初始化参数
String encoding = filterConfig.getInitParameter("encoding");
if (encoding != null) {
this.encoding = encoding;
}
System.out.println("1、字符编码过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//类型转换
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//设置编码格式
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=" + encoding);
//放行请求
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("2、字符编码过滤器执行");
}
@Override
public void destroy() {
System.out.println("3、字符编码过滤器销毁");
}
}

六、过滤器两种配置方式
1. 注解配置(最简单,推荐)
@WebFilter(urlPatterns = "/*", initParams = {@WebInitParam(name = "encoding", value = "UTF-8")})
2. web.xml 配置(传统方式)
XML
<!-- 配置过滤器-->
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>org.hlx.javaweb3_0323.CharacterFilter</filter-class>
<!-- 配置过滤器初始化参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- 配置过滤器映射-->
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
七、多个过滤器执行顺序
- 注解 :按 类名字母顺序 执行
- web.xml :按 mapping 配置顺序 执行

2、登录校验过滤器(未登录不能访问)
java
package org.hlx.javaweb3_0323;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author : HLX
* @ClassName :LoginFilter
* @date : 2026/3/24 10:19
* @Version :1.0
* @Description: TODO
* @modyified By :
*/
// 只拦截后台管理页面
@WebFilter("/admin/*")
public class LoginFilter implements jakarta.servlet.Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 类型转换
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 获取session对象
HttpSession session = request.getSession();
// 判断是否登录
if (session.getAttribute("username") != null) {
// 已登录,放行请求
filterChain.doFilter(request, response);
} else {
// 未登录 → 拦截,跳转到登录页
response.sendRedirect(request.getContextPath()+"/index.html");
}
System.out.println("2、登录过滤器拦截" + request.getRequestURI());
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("1、登录过滤器初始化");
}
@Override
public void destroy() {
System.out.println("3、登录过滤器销毁");
}
}

总结
- Filter 是请求拦截器,统一处理请求 / 响应
- 必须实现
Filter接口,重写doFilter chain.doFilter()= 放行- 最常用:统一编码、登录验证