Filter
Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
过滤器一般完成一些通用的操作。
快速入门
- 定义类,实现 Filter接口,并重写其所有方法。
- 配置Filter拦截资源的路径:在类上定义
@WebFilter
注解。而注解的value
属性值/*
表示拦截所有的资源。
- 在doFilter方法中输出一句话,并放行。
chain.doFilter(request,response);
就是放行,让其访问本该访问的资源。
执行流程
拦截路径配置
拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用@WebFilter
注解进行配置。如:@WebFilter("拦截路径")
拦截路径有如下四种配置方式:
- 拦截具体的资源:
/index.jsp
,只有访问index.jsp时才会被拦截 - 目录拦截:
/user/*
,访问/user下的所有资源,都会被拦截 - 后缀名拦截:
*.jsp
,访问后缀名为jsp的资源,都会被拦截 - 拦截所有:
/*
,访问所有资源,都会被拦截
过滤器链
过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。
上图中的过滤器链执行是按照以下流程执行:
- 执行
Filter1
的放行前逻辑代码 - 执行
Filter1
的放行代码 - 执行
Filter2
的放行前逻辑代码 - 执行
Filter2
的放行代码 - 访问到资源
- 执行
Filter2
的放行后逻辑代码 - 执行
Filter1
的放行后逻辑代码
使用注解配置Filter的优先级是按照过滤器类名(字符串)的自然排序。比如有如下两个名称的过滤器:BFilterDemo
和 AFilterDemo
。那一定是 AFilterDemo
过滤器先执行。
Listener
Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
监听器可以监听就是在application
,session
,request
三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
application
是ServletContext
类型的对象。
ServletContext
代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。
JavaWeb 提供了8个监听器:
ServletContextListener
是用来监听ServletContext
对象的创建和销毁。
ServletContextListener
接口中有以下两个方法:
void contextInitialized(ServletContextEvent sce)
:ServletContext
对象被创建了会自动执行的方法。void contextDestroyed(ServletContextEvent sce)
:ServletContext
对象被销毁时会自动执行的方法。
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//加载资源
System.out.println("ContextLoaderListener...");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//释放资源
}
}
启动服务器,就可以在启动的日志信息中看到
contextInitialized()
方法输出的内容,同时也说明了ServletContext
对象在服务器启动的时候被创建了。