JavaEE-Servlet-Filter和Listener

一.过滤器Filter

对指定的web资源进行拦截,实现一些特殊功能,如实现URL权限访问、过滤敏感词等等

1).注册过滤器

方式一
	在WEB-INF/web.xml注册
	<filter>
		<filter-name>filter</filter-name>
		<filter-class>com.xxx.xxFilter</filter-class>
		<init-param>
			<param-name>name1</param-name>
			<param-value>value1</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>filter</filter-name>		
		<url-pattern>/*</url-pattern> 指定要拦截的url
		<servlet-name>xxxServlet</servlet-name> 指定要拦截的Servlet
		<dispatcher>REQUEST</dispatcher> 指定要拦截资源的访问方式是REQUEST/FORWARD/INCLUDE/ERROR,默认REQUEST
	</filter-mapping>

方式二
	在com.xxx.xxFilter类添加注解
	@WebFilter(filterName="filter",urlPatterns={"/*"},servletNames={"Demo1Servlet"})

2).实现接口

创建: web应用加载时,创建所有过滤器对象,调用init()初始化,一直驻留内存;
销毁: web应用移除时,销毁所有过滤器对象,销毁前调用destroy()善后	
public class xxFilter implements Filter {
	public void destroy() {		
	}

	// 每次拦截资源后调用
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		FilterChain过滤器链对象,一个资源可能被多个过滤器所拦截,拦截顺序是web.xml中filter-mapping配置顺序
		FilterChain.doFilter()一旦被调用,就执行过滤器链的下一个节点,若当前是最后过滤器,则执行目标资源
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		filterConfig.getInitParameter(String name) 获取web.xml过滤器配置信息
		filterConfig.getServletContext() 获取ServletContext对象
	}
}

二.监听器Listener

Servlet监听器: 监听ServletContext、Session和Request域的变化。

1.监听三大作用域的创建和销毁

1)注册监听器
	方式一
	在WEB-INF/web.xml注册
	<listener>
		<listener-class>com.xxx.xxx</listener-class>
	</listener>
	
	方式二
	在com.xxx.xxx类添加注解@WebListener

2)实现监听器接口
	public class xxx implements ServletContextListener {			
		// ServletContext创建: web应用被加载时创建
		public void contextDestroyed(ServletContextEvent sce) {			
		}
		
		// ServletContext销毁: web应用被移除时销毁
		public void contextInitialized(ServletContextEvent sce) {			
		}			
	}
	应用场景: 保存全局对象,如:创建数据库连接池; 加载框架配置文件;实现任务调度定时器

	public class xxx implements HttpSessionListener {
		// Session创建:首次调用request.getSession()时创建
		public void sessionCreated(HttpSessionEvent se) {
		}
		
		// Session销毁:超30分钟没用时销毁 /调用invalidate()销毁 
		// 服务器非正常关闭时销毁(正常关闭则被钝化,再次开启则被活化)
		public void sessionDestroyed(HttpSessionEvent se) {
		}
	}
	
	public class xxx implements ServletRequestListener {
		// Request创建:浏览器请求开始时创建		
		public void requestDestroyed(ServletRequestEvent sre) {			
		}
		
		// Request销毁:浏览器请求结束时销毁
		public void requestInitialized(ServletRequestEvent sre) {		
		}
	}

2.监听三大作用域属性的增删改

public class xxx implements ServletContextAttributeListener {
	public void attributeAdded(ServletContextAttributeEvent scab) {
		System.out.println("属性加入"+scab.getName()+":"+scab.getValue());
	}

	public void attributeRemoved(ServletContextAttributeEvent scab) {
		System.out.println("属性移除"+scab.getName()+":"+scab.getValue());
	}

	public void attributeReplaced(ServletContextAttributeEvent scab) {
		System.out.println("属性替换"+scab.getName()+":"+scab.getValue()+
		":"+scab.getServletContext().getAttribute(scab.getName()));
	}
}

public class xxx implements HttpSessionAttributeListener {
	public void attributeAdded(HttpSessionBindingEvent se) {
	}

	public void attributeRemoved(HttpSessionBindingEvent se) {
	}

	public void attributeReplaced(HttpSessionBindingEvent se) {
	}
}

public class xxx implements ServletRequestAttributeListener {
	public void attributeAdded(ServletRequestAttributeEvent srae) {
	}
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
	}
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
	}
}

3.监听JavaBean对象在Session域中的变化

public class JavaBean类 implements HttpSessionBindingListener ,HttpSessionActivationListener{
	...
	// javabean对象被绑到session
	public void valueBound(HttpSessionBindingEvent event) {			
	}
	
	// javabean对象被移出session
	public void valueUnbound(HttpSessionBindingEvent event) {			
	}
	
	// javabean对象随session活化
	public void sessionDidActivate(HttpSessionEvent se) {
	}

	// javabean对象随session钝化
	public void sessionWillPassivate(HttpSessionEvent se) {
	}
}

简书: http://www.jianshu.com/p/46e5b3bf42d7
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54791009
GitHub博客:http://lioil.win/2017/01/30/Servlet-Listener.html
Coding博客:http://c.lioil.win/2017/01/30/Servlet-Listener.html