文章目录
- 过滤器的编写:
- 过滤器 API
- Filter
- FilterConfig
- FilterChain
- 生命周期
- 过滤器核心方法的细节
- 多个过滤器执行顺序
- <br />
过滤器——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*/@Overridepublic 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方法");
}
测试运行结果,我们发现过滤器放行之后执行完目标资源,仍会回到过滤器中:
多个过滤器执行顺序
运行结果