定义
过滤器可以拦截所有访问web资源的请求或响应操作。
是执行过滤任务的Filter对象,这些任务是针对对某一资源(servlet 或静态内容)的请求或来自某一资源的响应执行的,抑或同时针对这两者执行。
创建步骤
- 创建一个类,实现Filter接口
- 重写接口中的 doFilter方法,过滤操作的实现
- 在web.xml文件中配置
注意:在Filter的doFilter方法内如果没有执行chain.doFilter(request,response)那么资源是不会被访问到的。执行了才放行请求
Filter生命周期
和servlet类似: 实例化 --> 初始化 --> 服务 --> 销毁
当服务器启动,会创建Filter对象,并调用init方法,只调用一次。注意:并不是请求时创建,与servlet的默认不同
服务: 当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
销毁: 当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.
Filter拦截方式
servlet负责处理请求,filter负责拦截和放行请求。拦截方式四种:
- REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
- FORWARD:转发访问执行过滤器。包括RequestDispatcher#forward()方法、< jsp:forward>标签都是转发访问;
- INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、< jsp:include>标签都是包含访问;
- ERROR:当目标资源在web.xml中配置为< error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器
Filter实例:
字符编码过滤utf-8
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class MyFilterConfig implements Filter { private FilterConfig filterConfig; @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //通过filterConfig来获取配置信息中的初始化参数 String encoding = filterConfig.getInitParameter("encoding"); request.setCharacterEncoding(encoding); chain.doFilter(request, response);//放行 } @Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } }
web.xml配置
<filter> <filter-name>MyFilterConfig</filter-name> <filter-class>com.jxlg.filter.MyFilterConfig</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>MyFilterConfig</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>