关于Filter过滤器
Filter过滤器的作用
Servlet2.3以及之后的版本所提供的过滤请求与响应的对象
既能对客户端向服务器发送的请求进行过滤,也能对服务器向客户端产生的响应进行过滤
Filter对象的创建
创建一个Class实现Filter接口,并实现接口中三个抽象方法。
init()方法:
- 初始化方法,在创建Filter后立即调用。可用于完成初始化动作。
doFilter()方法:
- 过滤请求与相响应的方法,当客户端浏览器请求的URL与Filter所定义URL-Pattern所匹配,那么该请求会进到该过滤器执行相应操作,可用于对请求和响应实现预处理。
destroy()方法:
- 销毁方法,在销毁Filter之前会调用一次该方法,可用于完成资源释放等动作。
在Filter中设置请求编码
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //在过滤前设置请求编码 servletRequest.setCharacterEncoding("utf-8"); filterChain.doFilter(servletRequest,servletResponse); //响应的结果根据业务的需求来决定,不建议设置响应编码 servletResponse.setCharacterEncoding("utf-8"); }
FilterConfig对象的使用
用来读取<filter>中<init-param>初始化参数的对象,该对象通过参数传递到init方法中,用于读取初始化参数
- filterConfig.getInitParameter("name")
通过name获取对应的value。
- filterConfig.getInitParameterNames()
返回该Filter中所有中的值。
<filter> <filter-name>encodingfilter</filter-name> <filter-class>www.filter.encodingFilter</filter-class> <init-param> <param-name>code</param-name> <param-value>gbk</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
import javax.servlet.*; import java.io.IOException; /** * 设置请求编码 */ public class encodingFilter implements Filter { private String defaultcode="utf-8"; @Override public void init(FilterConfig filterConfig) throws ServletException { //获取initparam参数 String code=filterConfig.getInitParameter("code"); if (code!=null&&code.length()>0){ this.defaultcode=code; } } @Override public void destroy() { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //在过滤前设置请求编码 servletRequest.setCharacterEncoding(this.defaultcode); filterChain.doFilter(servletRequest,servletResponse); //响应的结果根据业务的需求来决定,不建议设置响应编码 servletResponse.setCharacterEncoding("utf-8"); } }
FilterChain过滤器链
技术特点
在对请求与响应做预处理时,可以实现“插拔式”程序设计-------根据需求,通过web.xml添加或去掉多个Filter;
当有多个过滤器对某个请求及响应进行过滤时,称这组过滤器为过滤器链
执行顺序
按照web.xml文件中配置的上下顺序来决定先后执行,在上面的先执行,在下面的后执行
web.xml
<filter> <filter-name>filter1</filter-name> <filter-class>www.filter.firstfilter</filter-class> </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>encodingfilter</filter-name> <filter-class>www.filter.encodingFilter</filter-class> <init-param> <param-name>code</param-name> <param-value>gbk</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
firstfilter.java
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("请求被过滤1!"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("响应被过滤1"); }
encodingfilter.java
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //在过滤前设置请求编码 servletRequest.setCharacterEncoding(this.defaultcode); System.out.println("请求被过滤2"); filterChain.doFilter(servletRequest,servletResponse); //响应的结果根据业务的需求来决定,不建议设置响应编码 servletResponse.setCharacterEncoding("utf-8"); System.out.println("响应被过滤2"); }
基于@WebFilter注解式开发Filter
- 通过@WebFilter注解替代web.xml中Filter 的配置。
- 使用注解式开发Filter时,执行顺序会根据Filter的名称进行排序的结果决定调用的顺序。

Filter的生命周期
Filter的生命周期由容器管理。
初始化:当容器启动时会实例化Filter并调用init方法完成初始化
服务:当客户端浏览器发送请求时,容器会启动一个新的线程来处理请求,如果请求的URL能够被过滤器所匹配,那么先调用过滤器中的doFilter(在处理请求的线程中)方法,再根据是否有chain.doFilter的指令,决定是否继续请求目标资源。
销毁:当容器关闭时 会销毁Filter对象,在销毁之前会调用destroy方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)