过滤器

  • 过滤器是一个用于拦截在数据源和数据目的地之间消息的一个对象

过滤器的功能

  • 分析请求,将请求发送给指定的资源或自己创建一个响应返回
  • 在请求到达服务器端前处理请求,设置请求信息,将请求封装成符合规则的对象
  • 在响应到达客户端前处理响应,将响应封装成符合规则的对象

过滤器的执行

  • 过滤器处理请求采取以下3种行动之一
  • 过滤器自身产生一个响应,返回给客户端
  • 把请求转发给过滤器链中的下一个过滤器,如果是最后一个过滤器则将请求转发给请求指定资源
  • 把请求转发到另一资源

过滤器实现

  1. 实现Filter接口
package com.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// 获取web.xml中的初始化参数的值
		System.out.println("TestFilter过滤器初始化方法");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("TestFilter过滤器执行");
		chain.doFilter(request,response);
	}

	@Override
	public void destroy() {
		System.out.println("TestFilter过滤器销毁方法");

	}

}
  1. 在web.xml中配置
<filter>
	<filter-name>test</filter-name>
	<filter-class>com.filter.TestFilter</filter-class>
<filter>
<filter-mapping>
	<filter-name>test</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

过滤器过滤相同资源时的顺序

  • Web容器加载的顺序:web.xml文件中配置的Filter的倒序
  • 拦截执行顺序:web.xml文件中配置的Filter的正序
  • 销毁顺序:web.xml文件中配置的Filter的倒序
  • 若使用的是注解配置,则用配置名按ASCII码进行排序,顺序同上

监听器

  • 监听器是一个实现特定接口的普通Java程序,这个程序专门用于监听另一个Java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行
Listener接口与事件对应表

分类

Linstener接口

Event类

与ServletContext相关

ServletContextListener

ServletContextEvent

-

ServletContextAttributeListener

ServletContextAttributeEvent

与HttpSession相关

HttpSessionListener

HttpSessionEvent

-

HttpSessionActivationListener

-

-

HttpSessionAttributeListener

HttpSessionBindingEvent

-

HttpSessionBindingLinstener

-

与ServletRequest相关

ServletRequestListener

ServletRequestEvent

-

ServletRequestAttributeListener

ServletRequestAttributeEvent

监听器的实现
  1. 实现对应的监听器接口
  2. web.xml中进行配置
    HttpSessionBindingListener不需要进行配置
<listener>
	<listener-class>com.listener.TestListener</listener-class>
</listener>
监听器的应用
  • ServletContext范围的监听器可以进行一些初始化的动作,如:当Web应用启动的时候进行全局配置
  • Session范围的监听器对一个会话过程(与客户端关联)中所产生的事件进行响应,可以对客户端信息的变化进行跟踪
  • Request范围的监听器可以监听用户的每次请求