过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。
它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。
它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。
常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。
过滤器的编写:
@WebFilter(filterName = "FilterDemo2",urlPatterns = "/*") public class FilterDemo1 implements Filter { /** * 过滤器的核心方法 * @param request * @param response * @param chain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { /** * 如果不写此段代码,控制台会输出两次:FilterDemo1拦截到了请求。 */ HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); if (requestURI.contains("favicon.ico")) { return; } System.out.println("FilterDemo1拦截到了请求"); } }
过滤器 API
Filter
返回类型 方法 简介
void init(FilterConfig conf) 用于执行过滤器的初始化工作,web容器会在web项目启动时自动调用该方法。
void doFilter(ServletRequest request,SerlvetResponse response,FilterChain chain) 当请求和响应被过滤器拦截后,都会交给doFilter来处理:其中两个参数分别是被拦截request和response对象,可以使用chain的doFliter方法来放行。
void destroy() 用于释放关闭Filter对象打开的资源,在web项目关闭时,由web容器自动调用该方法。
FilterConfig
FilterChain
生命周期
出生当应用加载的时候执行实例化和初始化方法。
活着只要应用一直提供服务,对象就一直存在。
死亡当应用卸载时,或者服务器宕机时,对象消亡。
Filter的实例对象在内存中也只有一份。所以也是单例的。
过滤器核心方法的细节
/** * 过滤器的核心方法 */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { /** * 如果不写此段代码,控制台会输出两次:FilterDemo1拦截到了请求。 HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); if (requestURI.contains("favicon.ico")) { return; }*/ System.out.println("FilterDemo1拦截到了请求"); //过滤器放行 chain.doFilter(request, response); System.out.println("FilterDemo1放行之后,又回到了doFilter方法"); }
测试运行结果,我们发现过滤器放行之后执行完目标资源,仍会回到过滤器中:
多个过滤器执行顺序
运行结果