Filter过滤器 and Listener监听器
一、Filter过滤器
基本概念:
对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能
方法
方法声明 | 功能描述 |
---|---|
init(FilterConfig filterConfig) | 初始化方法 |
doFilter(ServletRequest request,ServletResponse,response,FilterChain chain) | doFilter()方法有多个参数,其中,参数request和response为Web服务器或Filter链中的上一个Filter传递过来的请求和响应对象;参数chain代表当前Filter链的对象,在当前Filter对象中的doFilter()方法内部需要调用FilterChain对象的doFilter()方法,才能把请求交付给Filter链中的下一个Filter或者目标程序去处理 |
destroy() | 销毁方法 |
例:
package filter.test.demo001;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello Servlet<br/>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器对象在初始化时调用,可以配置一些初始化参数
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法体会被调用
PrintWriter out = servletResponse.getWriter();
out.write("Hello MyFilter");
}
@Override
public void destroy() {
// 过滤器对象在销毁时自动调用,释放资源
}
}
<filter><!--根元素用于注册一个Filter-->
<filter-name>MyFilter</filter-name><!--子元素用于设置Filter名称-->
<filter-class>filter.test.demo001.MyFilter</filter-class><!--子元素用于设置Filter类的完整名称-->
</filter>
<filter-mapping><!--根元素用于设置一个过滤器所拦截的资源-->
<filter-name>MyFilter</filter-name><!--子元素必须与<filter>中的<filter-name>子元素相同-->
<url-pattern>/MyServlet</url-pattern><!--子元素用于匹配用户请求的URL
可以使用通配符“*”来表示,例如*do适用于所有以.do结尾的Servlet路径-->
</filter-mapping>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>filter.test.demo001.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
Filter配置
Filter配置方法
1. web.xml配置方法
2. 注解配置
@WebFilter("/*")
配置详解:
1. 拦截路径配置
1. 具体资源配置:/index.jsp 只有访问index.jsp资源时过滤器才会拦截
2. 目录拦截:/user/* 访问/user下的所有路径时,过滤器就会被执行
3. 后缀名拦截: *.jsp 访问所有jsp文件时,过滤器就会被执行
4. 拦截所有资源:/* 访问所有资源时,过滤器就会被执行
2. 拦截方式配置 :资源被访问的方式
1.注解配置:设置dispatcherTypes属性
Filter映射
- 使用通配符“*”拦截用户的所有请求
<filter-mapping><!--根元素用于设置一个过滤器所拦截的资源-->
<filter-name>MyFilter</filter-name><!--子元素必须与<filter>中的<filter-name>子元素相同-->
<url-pattern>/*</url-pattern><!--子元素用于匹配用户请求的URL
可以使用通配符“*”来表示,例如*do适用于所有以.do结尾的Servlet路径-->
</filter-mapping>
- 拦截不同方式的访问请求:dispatcherTypes属性
- REQUEST:默认值
当用户直接访问页面时,Web容器将会调用过滤器 - INCLUDE:
如果目标资源是通过RequestDispatcher的include()方法访问,该过滤器会被调用 - FORWARD:
如果目标资源是通过RequestDispatcher的forward()方法访问,该过滤器会被调用 - ERROR:
如果目标资源是通过声明式异常处理机制调用的,该过滤器会被调用 - ASYNC:异步访问资源
- REQUEST:默认值
Filter链
在一个Web应用程序中可以注册多个Filter程序
每个Filter程序都可以针对某一个URL进行拦截
如果多个Filter程序都对同一个URL进行拦截
那么这些Filter就会组成一个Filter链(过滤器链)
FilterConfig接口
方法声明 | 功能描述 |
---|---|
String getFilterName() | getFilterName()方法用于返回在web.xml文件中为Filter所设置的名称,也就是返回< filter-name >元素的设置值 |
String getInitParameter(String name) | getInitParameter(String name)方法用于返回在web.xml文件中为Filter所设置的某个名称的初始化参数值,如果指定参数不存在,则返回null |
Enumeration getInitParameterNames() | getInitParameterNames()方法用于返回一个Enumeration集合对象,该集合对象中包含在web.xml文件中为当前Filter设置的所有初始化参数的名称 |
ServletContext getServletContext() | getServletContext()用于返回FilterConfig对象中所包装的ServletContext对象的引用 |
二、Listener监听器
重要组成部分
- 事件(Event):用户的一个操作
- 事件源:产生事件的对象
- 事件监听器(Listener):负责监听发生在事件源上的事件
- 事件处理器:监听器的成员方法,当事件发生的时候会触发对应的处理器(成员方法)
工作步骤
- 将监听器绑定到事件源,也就是注册监听器
- 事件发生时会触发监听器的成员方法,即事件处理器,传递事件对象
- 事件处理器通过事件对象获得事件源,并对事件源进行处理
八种监听器
类型 | 描述 |
---|---|
ServletContextListener | 用于监听ServletContext对象的创建与销毁过程 |
HttpSessionListener | 用于监听HttpSession对象的创建与销毁过程 |
ServletRequestListener | 用于监听ServletRequest对象的创建与销毁过程 |
ServletContextAttributeListener | 用于监听ServletContext对象中的属性变更 |
HttpSessionAttributeListener | 用于监听HttpSession对象中的属性变更 |
ServletRequesetAttributeListener | 用于监听ServletRequeset对象中的属性变更 |
HttpSessionBindingListener | 用于监听JavaBean对象绑定到HttpSession对象和从HttpSession对象解绑的事件 |
HttpSessionActivationListener | 用于监听HttpSession中对象活化和钝化的过程 |
监听事件的分类
- 用于监听域对象创建和销毁的事件监听器(ServletContextListener接口、HttpSessionListener接口、ServletRequestListener接口)
- 用于监听域对象属性增加和删除的事件监听器(ServlerContextAttributeListener接口,HttpSessionAttributeListener接口,ServletRequesetAttributeListener接口)
- 用于监听绑定到HttpSession域中某个对象状态的事件监听器(HttpSessionBindingListener接口,HttpSessionActivationListener接口)
监听域对象的生命周期
1. ServletContextListener:Tomcat启动和关闭时调用下面两个方法
public void contextInitialized(ServletContextEvent evt):
ServletContext对象被创建后调用;
public void contextDestroyed(ServletContextEvent evt):
ServletContext对象被销毁前调用;
2. HttpSessionListener:开始会话和结束会话时调用下面两个方法
public void sessionCreated(HttpSessionEvent evt):
HttpSession对象被创建后调用;
public void sessionDestroyed(HttpSessionEvent evt):
HttpSession对象被销毁前调用;
3. ServletRequestListener:开始请求和结束请求时调用下面两个方法
public void requestInitiallized(ServletRequestEvent evt):
ServletRequest对象被创建后调用;
public void requestDestroyed(ServletRequestEvent evt):
ServletRequest对象被销毁前调用。
监听域对象的属性变更
1. ServletContextAttributeListener:
在ServletContext域进行增、删、改属性时调用下面方法。
public void attributeAdded(ServletContextAttributeEvent evt)
public void attributeRemoved(ServletContextAttributeEvent evt)
public void attributeReplaced(ServletContextAttributeEvent evt)
2. HttpSessionAttributeListener:
在HttpSession域进行增、删、改属性时调用下面方法
public void attributeAdded(HttpSessionBindingEvent evt)
public void attributeRemoved(HttpSessionBindingEvent evt)
public void attributeReplaced(HttpSessionBindingEvent evt)
3. ServletRequestAttributeListener:
在ServletRequest域进行增、删、改属性时调用下面方法
public void attributeAdded(ServletRequestAttributeEvent evt)
public void attributeRemoved(ServletRequestAttributeEvent evt)
public void attributeReplaced(ServletRequestAttributeEvent evt)