目录
一、Filter 过滤器
1、概述
当访问服务器资源时,Filter 过滤器可以将请求拦截下来,完成一些特殊的处理,其作用一般用于完成一些通用的操作,比如:登录验证、统一编码处理、敏感字符过滤等
2、开发步骤
- 定义一个类,实现 Filter 接口
- 重写方法
- 配置拦截路径
- web.xml配置
- 注解配置
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();
//加载文件资源
String intiparameter = servletContext.getInitParameter(s);
//获取真实路径
String realPath = servletContext.getRealPath(intiparameter);
//加载进内存
try {
FileInputStream FS = new FileInputStream(realPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/*
服务器正常关闭后调用该方法,关闭后ServletContext对象被销毁
*/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}