第11章 Filter与 Listener
    
    教学要求
    
        (1) 熟练掌握:Filter与 Listener使用
        (2) 
        (3) 
    
    
    延伸阅读
    
    
	   
    11.1 Filter
    
	11.1.1 什么是过滤器
	
	
	
		
		图1 过滤器的处理方式
	
	
		
		图2 过滤器链(chain)
	
		
	11.1.2 过滤器初识和过滤器的生命周期
	【例1】 Filter生命周期
	Filter生命周期:在请求访问ch11_du/1/*资源时,运行此过滤器。
	(1) 创建的Filer类:在scr创建cn.dzj.ch11.filter包,创建LifeCycleFilter_000.java。右击[cn.dzj.ch11.filter]包 --> 新建 -- Filter -- class name:LifeCycleFilter_000 -- 下一步 -- Filer mapping -- LifeCycleFilter_000 -- Edit -- Pattern:/ch11_du/1/* -- 完成
	
	
		
		图3 创建Filter操作示意
	
	(2) 在WebContent/ch11_du/创建文件夹1,在1文件夹创建下列test.txt
	
	(3) 在WebContent/ch11_du/1/创建test.html
	
	(4) 在WebContent/ch11_du/1/创建1个小图片test.jpg
	
		
		图4 小图片test.jpg
	
	
	(5) 在WebContent/ch11_du/index01_000.html
	
	
	
	11.1.3 过滤器核心对象 
	
	
	过滤器配置
	
	
	11.1.4 filter应用举例
	【例2】 网站首页index.jsp访问计数过滤器
	(1) 在src下cn.dzj.ch11.filter包,创建CountFilter_000.java。
	
	
	(2) 在WebContent/ch11_du创建文件index02_000.jsp
	
		
	【例3】 图片资源防盗过滤器(保护/images/下资源)
	(1) 在src下cn.dzj.ch11.filter包,创建ImageRedirectFilter_000.java。
	
	
		
		图5 防盗图片/error.gif
	
	(2) 在WebContent/ch11_du/创建文件index03_000.html
	
	
	(3) 在WebContent/ch11_du/index03_000_2.html
	
	(4) 创建WebContent/images文件夹, 并创建126.jpg,127.jpg,128.jpg,129.jpg,test.txt 5个文件
	  
		
	
	复制[index03_000_2.html]到桌面并用浏览器打开测试之。
	【例4】 Login过滤器(只有登录的用户才能访问/ch11_du/4/目录及其子目录的资源)
	(1) 在src下cn.dzj.ch11.filter包,创建LoginFilter_000.java。
	
	
	(2) 在src下cn.dzj.ch11.servlet包,创建LoginServlet_000.java。
	
	
	(3) 在WebContent/ch11_du/2创建文件[登录及其未登录资源访问测试界面]login.jsp
	
	
	(4) 在WebContent/ch11_du/2创建文件[登录成功后的主界面及其登录成功的资源访问测试界面]index.jsp
	
	
	(5) 在WebContent/ch11_du/2创建文件[登录成功后的登出界面]logOut.jsp
	
	
	(6) 在WebContent/ch11_du/2和其子目录下创建下列个建3个文件:test.txt[莫愁前路无知己,天下谁人不识君。]、test.htm[劝君更尽一杯酒,西出阳关无故人。]、和1个小图片test.jpg,单击下列链接测试和停止tomcat,测试时观察[控制台]输出,测试完毕后屏蔽LoginFilter.java第20-22行注入,停止此过滤器再次运行。
		
	【例5】敏感文字过滤(过滤:糟糕,混蛋,他妈的,他奶奶的)
	(1) 在src下cn.dzj.ch11.filter包,创建WordFilter_000.java。
	
	
	(2) 在src下创建cn.dzj.ch11.servlet包,创建MessageServlet_000.java。
	
	
	(3) 在WebContent/ch11_du/5 创建文件result_000.jsp
	
	
	(4) 在WebContent/ch11_du/5创建文件index_000.jsp
	
	
		
	11.2 监听器
	11.2.1 监听器简介
	
  
  	Servlet3.1中web对象、监听器接口与其事件的对应关系
	
		| Web对象 | 
		Listener接口 | 
		Event(事件) | 
		方法 | 
	
	
		application(应用) 或(ServletContext上下文) | 
		ServletContextListener(Servlet上下文监听器) | 
		ServletContextEvent(生命周期事件) | 
		contextInitialized(ServletContextEvent arg0)--初始化  
            contextDestroyed(ServletContextEvent arg0)--销毁 | 
	
	
		| ServletContextAttributeListener(Servlet上下文属性监听器) | 
		ServletContextAttributeEvent(属性改变事件) | 
		attributeAdded(ServletContextAttributeEvent arg0)--增加后  
            attributeRemoved(ServletContextAttributeEvent event)--移除后  
            attributeReplaced(ServletContextAttributeEvent event)--替换 | 
	
	
		session(会话) 或(HttpSession Http会话) | 
		HttpSessionListener(Http会话监听器) | 
		HttpSessionEvent(生命周期事件) | 
		sessionCreated(HttpSessionEvent se)--创建后 sessionDestroyed(HttpSessionEvent se)--销毁后 | 
	
	
		| HttpSessionAttributeListener(Http会话属性监听器) | 
		HttpSessionBindingEvent(属性改变事件) | 
		attributeAdded(HttpSessionBindingEvent event)--增加后  
            attributeRemoved(HttpSessionBindingEvent event)--移除后  
            attributeReplaced(HttpSessionBindingEvent event)--替换 | 
	
	
		| HttpSessionActivationListener(http会话激活监听器) | 
		HttpSessionEvent(会话迁移事件) | 
		sessionDidActivate(HttpSessionEvent se)--会话激活  
            sessionWillPassivate(HttpSessionEvent se)--会话钝化 | 
	
 
	
		| HttpSessionBindingListener(http会话激活监听器) | 
		HttpSessionBindingEvent(对象绑定事件) | 
		valueBound(HttpSessionBindingEvent event)--绑定  
            valueUnbound(HttpSessionBindingEvent event)--解绑 | 
	
 
	
		| HttpSessionIdListener(http会话ID改变监听器) | 
		HttpSessionEvent(会话迁移事件) | 
		sessionDidActivate(HttpSessionEvent se)--会话激活  
            sessionWillPassivate(HttpSessionEvent se)--会话钝化 | 
	
 
	
		request(请求) 或(ServletRequest Servlet请求) | 
		ServletRequestListener(Servlet请求监听器) | 
		ServletRequestEvent(生命周期事件) | 
		requestInitialized(ServletRequestEvent arg0)--请求初始化  
            requestDestroyed(ServletRequestEvent arg0)--请求销毁 | 
	
	
		| ServletRequestAttributeListener(Servlet请求属性监听器) | 
		ServletRequestAttributeEvent(请求属性改变事件) | 
		attributeAdded(ServletRequestAttributeEvent arg0)--增加后  
            attributeRemoved(ServletRequestAttributeEvent arg0)--移除后  
            attributeReplaced(ServletRequestAttributeEvent arg0)--替换 | 
	
	
		| AsyncListener(异步请求监听器) | 
		AsyncEvent(异步请求事件) | 
		onStartAsync(AsyncEvent arg0)--异步开始  
            onComplete(AsyncEvent arg0)--异步完成  
            onTimeout(AsyncEvent arg0)--异步超时  
            onError(AsyncEvent arg0)--异步出错 | 
	
  
  ServletContextListener 	ServletContextEvent
ServletContextAttributeListener 	ServletContextAttributeEvent
HttpSessionListener 	HttpSessionEvent
HttpSessionAttributeListener 	HttpSessionBindingEvent
HttpSessionIdListener 	HttpSessionEvent
HttpSessionActivationListener 	HttpSessionEvent
HttpSessionBindingListener 	HttpSessionBindingEvent
ServletRequestListener 	ServletRequestEvent
ServletRequestAttributeListener 	ServletRequestAttributeEvent
AsyncListener 	AsyncEvent
  	
		
		图6 监听器概述
	
	11.2.2 servlet上下文监听
	1. javax.servlet.ServletContextListener接口:监听ServletContext对象的初始化、销毁事件
	
   
 	2. javax.servlet.ServletAttributeListener接口:监听ServletContext对象属性添加、修改和删除事件
	
  
	
		
		图7 创建监听器步骤图示
	
   
   	【例6】 ServletContextListener监听器
  	在src下创建cn.dzj.ch11.listener包,创建实现了ServletContextListener接口的MyServletContentListener_000.java监听器。  
	
   	【例7】 ServletContextListener监听器
	(1) 在src下cn.dzj.ch11.listener包,创建实现了ServletConnextAtrributeListener接口的MyServletContextAttributeListener_000.java监听器。
	
	
 	(2) 创建[测试]页面:WebContent\ch11_du\index07_000.jsp,启停web服务器在控制台观看器输出提示。完毕后屏蔽@WebListener注解停此监听器。
	
	
	   
	11.2.3 HttpSession监听
	1. 在Servlet API中定义了javax.servlet.http.HttpSession接口,Servlet容器必须实现这一个接口。当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息。Servlet容器为HttpSession对象分配一个唯一的标识符,叫做Session ID,Servlet容器把Session ID作为Cookie保存在客户的浏览器中,每次客户发出HTTP请求时,Servlet容器可以从HttpRequest对象中读取Session ID,然后根据Session ID找到相应的HttpSession对象,从而获得客户的状态信息。HttpSession接口有如下方法:
	
	
	2. javax.servlet.http.HttpSessionListener接口: 监听Session对象的初始化、销毁事件
	
	
	3. javax.servlet.http.HttpSessionAttributeListener接口:监听HttpSession对象属性添加、修改和移除事件
	
    
    【例8】 HttpSession监听
	(1) 在src下cn/dzj/ch11/listener包,创建实现了HttpSessionListener,HttpSessionAttributeListener接口的MyHttpSessionListener_000.java监听器。
	
 
	(2) 创建[设置session属性]jsp页面:WebContent\ch11_du\session_setAttribute_000.jsp
	
	(3) 创建[移除session属性]jsp页面:WebContent\ch11_du\session_removeAttribute_000.jsp
	
	(4) 创建[设置session有效时间]jsp页面:WebContent\ch11_du\session_setMaxInactiveInterval_000.jsp
	
	(5) 创建[销毁session]jsp页面:WebContent\ch11_du\session_invalidate_000.jsp
	
	(6) 创建[设置会话属性]jsp页面:WebContent\ch11_du\session_000.jsp
	
	
	(7) 创建[显示答案(获取会话属性)]jsp页面:WebContent\ch11_du\result08_000.jsp
	
	(8) 创建[用户注册]页面:WebContent\ch11_du\index08_000.jsp,启停web服务器在控制台观看器输出提示。完毕后屏蔽@WebListener注解停此监听器。
	
	
 	【例9】 监听器统计在线人数
	Jsp/servlet标准不要求一个web容器支持分布式应用,但是他一定要支持HttpSessionActivationListener接口,以使代码可以支持分布式环境。
一般免费的web容器都不支持分布式,weblogic websphere是支持的。为了负载均衡可以迁移一个session到其他的jvm.session的passivation(钝化---非活化)。
passivation是指非活动的session被写入持久设备(比如硬盘)。
activate自然就是相反的过程。
在分布式环境中切换的属性必须实现serializable接口。
一般情况下他和HttpSessionBindingListener一起使用。
	3. javax.servlet.http.HttpSessionActivationListener接口:
	
	4. javax.servlet.http.HttpSessionBindingListener接口:
	
	(1) 在src下cn/dzj/ch11/listener包,创建UserInfoList.java
	
	(2) 在src下cn/dzj/ch11/listener包,创建实现了HttpSessionBindingListener接口的UserInfoTrace.java监听器。
	
	(3) 创建[用户登出]jsp页面:WebContent\ch11_du\loginOut09_000.jsp
	
    
	(4) 创建[用户列表]页面:WebContent\ch11_du\showUser09_000.jsp
	
    
	(5) 创建[使用监听查看在线用户(用户登录)]页面:WebContent\ch11_du\index09_000.jsp
	
	
	11.2.4 servlet请求监听
	
    
	【例10】 利用监听使服务器端机器免登录
	(1) 在src下cn/dzj/ch11/listener包,创建实现了ServletRequestListener, ServletRequestAttributeListener接口的Listenerlocalhost_000.java监听器。
	
	(2) 创建[用户登录]页面:WebContent\ch11_du\index10_000.jsp
	
	(3)  创建[系统主页面]页面:WebContent\ch11_du\show10_000.htm
	
	
	
	11.3 servlet 3.0新特性
	11.3.1 新增注入
	
    11.4 习题
    
    1.填空题(概念、知识点----------讲义中醒目的关键字)
    (1) 
    (2) 
    (3) 
    (4) 
    2.操作题
    (1) 
    (2)  
    (3) 
    (4) 
    3.编程题
	jsp+javabean+servlet+filter+Cookie+jdbc的用户登录应用
	【步骤1】 创建【用户】JavaBean、数据库表和数据库连接公用模块
	(1) 在src下创建cn.dzj.ch11.bean包,创建JavaBean类Admin00.java。
	
	
	(2) 在MySql中,创建或打开app_dujw数据库,并在此库中创建admin00数据表。
	
	(3) 在src下创建cn.dzj.ch11.util包,创建数据库连接公用类DBConn.java。
	
	【步骤2】 创建dao及其impl
	(1) 在src下创建cn.dzj.ch11.dao包,创建dao数据访问接口BaseDao.java。
	
	(2) 在src\cn.dzj.ch11.dao包,创建dao数据访问接口AdminDao00.java。
	
	(3) 在src下创建cn.dzj.ch11.dao.impl包,创建AdminDao00接口的实现类AdminDaoImpl00.java。
	
	【步骤3】 创建service及其impl
	(1) 在src下创建cn.dzj.ch11.service包,并在包下创建BaseService.java
	
	(2) 在src下cn.dzj.ch11.service包,创建AdminService00.java
	
	(3) 在src下创建cn.dzj.ch11.service.impl包,创建AdminService00接口的实现类AdminServiceImpl00.java
	
	【步骤4】 实创建[登录界面]、servlet类、filter类
	(1) 创建[登录界面]页面:WebContent\jw_du\ch11_du\4\login_000.jsp
	
	(2) 创建[用户登录]的servlet类:cn.dzj.ch11.servlet\AdminServlet00.java
	
	(3) 创建[登录成功界面]:WebContent\jw_du\ch11_du\14\sc.jsp
	
	(4) 创建Filter类:cn.dzj.ch11.filter\AutoLoginFilter_000.java
	
	自动登录管理
	
    
    本章参考文献
    
    
    
      返回目录