**过滤器的作用:** 过滤器可以对所有的请求或者响应做拦截操作.
1:以常规的方式调用资源(Servlet/JSP);
2:利用修改过的请求信息调用资源;
3:调用资源之后,但在响应到客户端之前,对响应做出修改;
4:阻止当前资源调用,代之转到其他资源.
### Filter的开发和使用
1:自定义一个类(XxxFilter,Xxx表示功能名),实现于javax.servlet.Filter接口.
2:在wed.xml里面配置拦截器
<filter>
<filter-name>XxxFilter</filter-name>
<filter-class>XxxFilter类的全限定名</filter-class>
</filter>
<filter-mapping>
<filter-name>XxxFilter</filter-name>
<!--表示:当前Filter只对哪些资源做过滤/拦截操作,只对hello.jsp做拦截-->
<url-pattern>/hello.jsp</url-pattern>
</filter-mapping>
Filter的生命周期方法
void init(FilterConfig config): 初始化方法
(2):void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):执行过滤的方法(每一次请求都会执行过滤)
(3):void destroy():销毁方法 执行的流程: 在启动Tomcat服务器的时候,就会执行构造器和init方法. 构造器--->init方法 -----> ( doFilter方法 )N次------->destroy方法
-
具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
-
拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
-
后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
-
拦截所有资源:/* 访问所有资源时,过滤器都会被执行
-
监听器分类
1.按监听对象分类
(1)用于监听应用程序对象(ServletContext)
(2)用于监听用户会话对象(HttpSession)
(3)用于监听请求消息对象(ServletRequest)
2.按监听事件分类
(1)监听对象的创建和销毁的事件监听器。
(2)监听对象属性变更(添加、修改、删除)的监听器。
监听器接口
Servlet API中定义了监听器接口,用来监听不同的事件类型。
ServletContextListener:上下文监听器;
ServletContextAttribute:上下文属性监听器;
ServletRequestListener:请求监听器;
ServletRequestAttributeListener:请求属性监听器;
HttpSessionListener:会话监听器;
HttpSessionAttribute:会话属性监听器.
配置监听器类:
创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。
<listener>
<listener-class>监听器类全类名</listener-class>
</listener>
实例
监听器类
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
public class ObjectListener implements ServletContextListener, ServletRequestListener {
/*
监听ServletContext对象的创建
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext创建了");
ServletContext application = sce.getServletContext();//整个应用程序只有一个对象
application.setAttribute("config","123");//设置初始化数据
}
/*
监听ServletContext对象的销毁
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁了");
}
/*
请求对象创建
*/
long s = 0;
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("请求对象创建");
s = System.currentTimeMillis();
}
/*
请求对象销毁
*/
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("请求对象销毁");
//获取客户端ip
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
System.out.println(request.getRemoteAddr()+"请求耗时:::"+(System.currentTimeMillis()-s));
}