Filter&Listener
Filtet
Filter概述
Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

Filter快速入门
进行 `Filter` 开发分成以下三步实现
* 定义类,实现 Filter接口,并重写其所有方法
* 配置Filter拦截资源的路径:在类上定义 `@WebFilter` 注解。而注解的 `value` 属性值 `/*` 表示拦截所有的资源
* 在doFilter方法中输出一句话,并放行
FilterDemo 过滤器完整代码如下:
@WebFilter("/*")
public class FilterDemo implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("1.FilterDemo...");
//放行
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
Filter执行流程

Filter拦截路径配置
拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter 注解进行配置。如:@WebFilter("拦截路径")
拦截路径有如下四种配置方式:
* 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
* 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
* 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
* 拦截所有:/*:访问所有资源,都会被拦截
过滤器链
过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。
如下图就是一个过滤器链,我们学习过滤器链主要是学习过滤器链执行的流程

我们现在使用的是注解配置Filter,而这种配置方式过滤器执行的优先级是按照过滤器类名(字符串)的自然排序。
Listener
Listener概述
* Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
* 监听器可以监听就是在 `application`,`session`,`request` 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
* request 和 session 我们学习过。而 `application` 是 `ServletContext` 类型的对象。
* `ServletContext` 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。
Listener分类
JavaWeb 提供了8个监听器:

这里面只有 `ServletContextListener` 这个监听器后期我们会接触到,`ServletContextListener` 是用来监听 `ServletContext` 对象的创建和销毁。
`ServletContextListener` 接口中有以下两个方法
* `void contextInitialized(ServletContextEvent sce)`:`ServletContext` 对象被创建了会自动执行的方法
* `void contextDestroyed(ServletContextEvent sce)`:`ServletContext` 对象被销毁时会自动执行的方法
Listener快速入门
我们只演示一下 `ServletContextListener` 监听器
* 定义一个类,实现`ServletContextListener` 接口
* 重写所有的抽象方法
* 使用 `@WebListener` 进行配置
ContextLoaderListener过滤器完整代码如下:
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//加载资源
System.out.println("ContextLoaderListener...");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//释放资源
}
}
启动服务器,就可以在启动的日志信息中看到 contextInitialized( ) 方法输出的内容,同时也说明了 ServletContext 对象在服务器启动的时候被创建了。

浙公网安备 33010602011771号