Filter 过滤器和 Listener 监听器
3、过滤器执行流程
请求先经过过滤器
经过过滤器过滤后再请求资源
请求完资源后再回到过滤器
注:两个经过过滤器会对 request 对象请求数据进行增强,对 response 对象响应数据进行增强(即过滤数据)
4、过滤器生命周期
init()方法:在服务器启动后创建 Filter 对象,调用 init 方法,只执行一次,用于加载资源
doFilter()方法:每一次请求被拦截请求资源时调用,可执行多次
destory()方法:服务器正常关闭时调用 distory 方法销毁 Filter 对象,只执行一次,用于释放资源
@WebFilter("/*") //访问所有资源之前都会执行该过滤器
public class myFilter implements Filter {
/*
在服务器启动后创建 Filter 对象,调用 init 方法,只执行一次,用于加载资源
*/
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
/*
每一次请求被拦截请求资源时调用,可执行多次
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("oneStar");
//放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("BackoneStar");
}
/*
服务器正常关闭时调用 distory 方法销毁 Filter 对象,只执行一次,用于释放资源
*/
public void destroy() {
System.out.println("销毁");
}
}
5、过滤器配置问题
【1】拦截路径配置
具体资源路径:/index.jsp ==> 只有访问 index.jsp 资源时,过滤器才会被执行
拦截目录:/user/* ==> 访问/user 下的所有资源时,过滤器都会被执行
后缀名拦截:*.jsp ==> 访问所有后缀名问 jsp 资源时,过滤器都会被执行
拦截所有资源:/* ==> 访问任何资源,过滤器都会被执行
【2】拦截方式的配置
注解配置(设置配置文件的 dispatcherTypes 属性)
REQUEST:默认值,浏览器直接请求资源
FORWARD:转发访问资源
INCLUDE:包含访问资源
ERROR:错误跳转资源
ASYNC:异步访问资源
web.xml 配置
配置<dispatcher></dispatcher>标签即可
//浏览器直接请求 index.jsp 资源时,该过滤器会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
//只有转发 index.jsp 资源时,该过滤器才会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//浏览器直接请求 index.jsp 资源,转发 index.jsp 资源时,该过滤器会被执行
@WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
public class myFilter implements Filter {
6、过滤器链(配置多个过滤器)
【1】执行顺序
过滤器 1
过滤器 2
资源执行
过滤器 2
过滤器 1
【2】过滤器先后顺序
注解配置:按照类名的字符串比较规则进行比较,值小的先执行
eg:AFilter 和 BFilter,AFilter 先执行
web.xml:<filter-mapping>中谁定义在上面就先执行谁
二、Listener 监听器
==============
监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通 java 程序,这个程序专门用于监听另一个 java 对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。比如监听在线用户的数量。
1、ServletContextListener 接口
ServletContextListener 接口主要是监听 ServletContext 对象的创建和销毁,用到的方法有:
void contextDestoryed(ServletContextEvent
sce):ServletContext 对象销毁之前会调用该方法
void contextInitialized(ServletContextEvent sce):ServletContext 对象创建后会调用该方法
2、开发步骤
定义一个类,实现 ServletContextListener 接口
重写方法
配置
web.xml 配置
注解配置
@WebListener
public class myListener implements ServletContextListener {
/*
监听 ServletContext 对象,服务器启动后自动创建 ServletContext 对象
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//获取 ServletContext 对象
ServletContext servletContext = servletContextEvent.getServletContext();
//加载文件资源
评论