`
happyqing
  • 浏览: 3152030 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

J2EE监听器和过滤器基础

阅读更多

Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文。

监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听。

 

  • ServletContex监听器
ServletContex又叫application,存在范围是整个Servlet容器生命周期,当系统启动时就会创建,系统关闭时会销毁,该对象通常存放一些非常通用的数据,但是不推荐存放太多,否则长期占据内存空间会影响服务器性能。
基于ServletContex的监听器可以继承两个接口并实现接口中相应的方法:
ServletContextListener接口定义了两个方法contextInitialized和contextDestroyed,分别在ServletContex创建和销毁时触发;
ServletContextAttributeListener接口定义了三个方法attributeAdded,attributeRemoved和attributeReplaced,分别在给ServletContex添加属性值,删除属性值和替换属性值时触发。
下面创建了一个基于Application的监听器:
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * Application监听器,Servlet中的Application即ServletContext
 * 
 * @author Administrator
 */
public class ApplicationListener implements ServletContextListener,
		ServletContextAttributeListener {
	
    /**
     * Default constructor. 
     */
    public ApplicationListener() {
        // TODO Auto-generated constructor stub
    }
	
	/**
	 * application初始化时触发的方法
	 */
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("Application创建:" + arg0.getServletContext());
	}
	
	/**
	 * application中添加属性值时触发的方法
	 */
	@Override
	public void attributeAdded(ServletContextAttributeEvent arg0) {  
		System.out.println("Application添加新属性:key="+arg0.getName()+"  value="+arg0.getValue());
	}
	
	/**
	 * application中替换属性值时触发的方法
	 */
	@Override
	public void attributeReplaced(ServletContextAttributeEvent arg0) {
		System.out.println("Application替换属性:key="+arg0.getName()+"  value="+arg0.getValue());
	}
	
	/**
	 * application中删除属性值时触发的方法
	 */
	@Override
	public void attributeRemoved(ServletContextAttributeEvent arg0) {
		System.out.println("Application移除属性:key="+arg0.getName()+"  value="+arg0.getValue());
	}
	
	/**
	 * application销毁时触发的事件
	 */
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("Application销毁:" + arg0.getServletContext());
	}
	
}
最后在web.xml需要注册监听器,注册方式非常简单,注意标签<description>和<display-name>不是必须的:
<listener>  
	<description>application listener</description>  
	<display-name>application_listener</display-name>  
	<listener-class>com.bless.listener.application.ApplicationListener</listener-class>  
</listener>
 
随后启动java web项目,监听器就会运行。

 

 

 

  • Session监听器
Session对于做web项目的人来说应该非常熟悉了,Session的生命周期是一个用户的一次会话,简单的说当一个用户进入某个网站,在该网站服务器就已经为用户创建了一个Session对象,用户在网站内的任何操作都是在session周期内。
误区:某些人认为我进入某网站,随后关闭浏览器,我的session就已经销毁了。其实不然,因为session存储在服务器端,服务器并不能主动捕获到浏览器关闭的事件,即使关闭浏览器,Session对象依然存在服务器中。所以如果编写web应用时一定要考虑session什么时候销毁,销毁session对象的方式有两种:一种是调用session的invalidate方法,另一种是在web.xml中定义session失效时间session-timeout。
Session监听器也有两个接口,其功能与前面介绍的ServletContex类似:HttpSessionListener用于监听Session创建和销毁的事件,HttpSessionAttributeListener用于监听Session属性赋值,删除和替换的事件:
 
Java代码  收藏代码
  1. /** 
  2.  * Session监听器 
  3.  * @author Administrator 
  4.  */  
  5. public class SessionListener implements HttpSessionListener,  
  6.         HttpSessionAttributeListener {  
  7.     Vector<HttpSession> listSession = null;  
  8.       
  9.     /** 
  10.      * 创建Session调用的方法 
  11.      * 将session对象放入listSession集合中 
  12.      */  
  13.     @Override  
  14.     public void sessionCreated(HttpSessionEvent arg0) {  
  15.         synchronized (this) {  
  16.             if(listSession == null){  
  17.                 listSession = new Vector<HttpSession>();  
  18.             }  
  19.         }  
  20.         listSession.add(arg0.getSession());  
  21.         System.out.println("\n\n创建一个Session:"+arg0.getSession());  
  22.         System.out.println("[当前存在的Session:]");  
  23.         for (HttpSession session : listSession) {  
  24.             System.out.println("--->"+session);  
  25.         }  
  26.     }  
  27.       
  28.     /** 
  29.      * 销毁Session调用的方法 
  30.      * 移除listSession集合对应session值 
  31.      */  
  32.     @Override  
  33.     public void sessionDestroyed(HttpSessionEvent arg0) {  
  34.         listSession.remove(arg0.getSession());  
  35.         System.out.println("\n\n销毁一个Session:"+arg0.getSession());  
  36.         System.out.println("[当前存在的Session:]");  
  37.         for (HttpSession session : listSession) {  
  38.             System.out.println("--->"+session);  
  39.         }  
  40.     }  
  41.       
  42.     /** 
  43.      * session属性添加时调用的方法 
  44.      */  
  45.     @Override  
  46.     public void attributeAdded(HttpSessionBindingEvent arg0) {  
  47.         System.out.println("\n\n添加一条Session-->key:"+arg0.getName()+"    属性value:"+arg0.getValue());  
  48.     }  
  49.       
  50.     /** 
  51.      * session属性移除时调用的方法 
  52.      */  
  53.     @Override  
  54.     public void attributeRemoved(HttpSessionBindingEvent arg0) {  
  55.         System.out.println("\n\n删除一条Session-->key:"+arg0.getName()+"    属性value:"+arg0.getValue());  
  56.     }  
  57.       
  58.     /** 
  59.      * session属性替代时调用的方法 
  60.      */  
  61.     @Override  
  62.     public void attributeReplaced(HttpSessionBindingEvent arg0) {  
  63.         System.out.println("\n\n覆盖一条Session-->key:"+arg0.getName()+"    属性value:"+arg0.getValue());  
  64.     }  
  65.   
  66. }  

 

在web.xml中定义相应监听器配置:

 

Xml代码  收藏代码
  1. <listener>  
  2.     <listener-class>com.bless.listener.session.SessionListener</listener-class>  
  3.   </listener>  
  4. <!-- Session超时配置 -->  
  5.   <session-config>  
  6.     <session-timeout>1</session-timeout>  
  7.   </session-config>  

 

 

 

 

  • Request监听器
request监听器使用方法跟前面也是非常类似的,一个request生命周期是向服务器发送请求到服务器响应最后反应到页面的整个过程。Request监听器对应ServletRequestListener,ServletRequestAttributeListener接口,根据不同需求实现相应接口就行了。
 
Java代码  收藏代码
  1. /** 
  2.  * Request事件监听器 
  3.  * @author Administrator 
  4.  */  
  5. public class RequestListener implements ServletRequestListener,  
  6.         ServletRequestAttributeListener {  
  7.   
  8.     @Override  
  9.     public void requestDestroyed(ServletRequestEvent arg0) {  
  10.         System.out.println("request销毁:"+arg0.getServletRequest());  
  11.     }  
  12.   
  13.     @Override  
  14.     public void requestInitialized(ServletRequestEvent arg0) {  
  15.         System.out.println("request创建:"+arg0.getServletRequest());  
  16.     }  
  17.   
  18.     @Override  
  19.     public void attributeAdded(ServletRequestAttributeEvent arg0) {  
  20.         System.out.println("request属性添加   key="+arg0.getName()+"   value="+arg0.getValue());  
  21.     }  
  22.   
  23.     @Override  
  24.     public void attributeRemoved(ServletRequestAttributeEvent arg0) {  
  25.         System.out.println("request属性删除   key="+arg0.getName()+"   value="+arg0.getValue());  
  26.     }  
  27.   
  28.     @Override  
  29.     public void attributeReplaced(ServletRequestAttributeEvent arg0) {  
  30.         System.out.println("request属性替换   key="+arg0.getName()+"   value="+arg0.getValue());  
  31.     }  
  32.   
  33. }  
 web.xml配置:
 
Java代码  收藏代码
  1. <listener>  
  2.     <listener-class>com.bless.listener.request.RequestListener</listener-class>  
  3.   </listener>  
 
 
 
 
  • Filter过滤器
当页面发送请求时,符合filter过滤范围的请求会首先进入过滤器,过滤器就可以执行一些过滤操作:比如编码格式,session验证,日志记录等。而这些功能都是自己编写过滤器实现的。
要实现一个过滤器,需要继承Filter接口,实现init、doFilter和destroy方法,这三个方法分别在过滤器初始化、过滤器运行和过滤器销毁时执行。
下面这段代码,是一个字符集过滤器,每次请求都会设置字符集编码格式,注意每次请求都会运行doFilter方法,过滤之后你需要在方法内调用FilterChain.doFilter这样就能让请求访问指定的servlet。
假设你不希望请求访问下一个servlet,你可以选择重定向,跳转到指定页面。
Java代码  收藏代码
  1. /** 
  2.  *  
  3.  * @author     : bless<505629625@qq.com> 
  4.  * Create Time : 2011-5-10下午10:38:19 
  5.  * Description : 字符集格式过滤器 
  6.  * 
  7.  */  
  8. public class EncodingFilter implements Filter {  
  9.     //默认编码格式UTF-8  
  10.     private static final String DEFAULT_ENCODE = "UTF-8";  
  11.       
  12.     private String encodeName; // 编码格式  
  13.   
  14.     public void destroy() {  
  15.   
  16.     }  
  17.   
  18.     /** 
  19.      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 
  20.      */  
  21.     public void doFilter(ServletRequest request, ServletResponse response,  
  22.             FilterChain chain) throws IOException, ServletException {  
  23.         try {  
  24.             if (encodeName == null || "".equals(encodeName.trim())) {  
  25.                 request.setCharacterEncoding(DEFAULT_ENCODE);  
  26.                 response.setCharacterEncoding(DEFAULT_ENCODE);  
  27.             } else {  
  28.                 request.setCharacterEncoding(encodeName);  
  29.             }  
  30.         } catch (UnsupportedEncodingException e) {  
  31.             throw new UnsupportedEncodingException("编码格式过滤错误,请确认web.xml填入了正确的编码格式");  
  32.         }  
  33.         chain.doFilter(request, response);  
  34.     }  
  35.   
  36.     /** 
  37.      * @see Filter#init(FilterConfig) 
  38.      */  
  39.     public void init(FilterConfig fConfig) throws ServletException {  
  40.         //获取web.xml配置的<param-name>encodeName</param-name>的值  
  41.         this.setEncodeName(fConfig.getInitParameter("encodeName"));   
  42.     }  
  43.   
  44.     public String getEncodeName() {  
  45.         return encodeName;  
  46.     }  
  47.   
  48.     public void setEncodeName(String encodeName) {  
  49.         this.encodeName = encodeName;  
  50.     }  
  51.   
  52. }  
 
然后在web.xml中定义filter即可,标签init-param可以做一个参数配置,在filter中通过init方法参数FilterConfig.getInitParameter获得:
Xml代码  收藏代码
  1. <filter>  
  2.     <filter-name>encoding</filter-name>  
  3.     <filter-class>com.mt.filter.EncodingFilter</filter-class>  
  4.     <init-param>  
  5.         <param-name>encodeName</param-name>  
  6.         <param-value>GBK</param-value>  
  7.     </init-param>  
  8.   </filter>  
  9.   <filter-mapping>  
  10.     <filter-name>encoding</filter-name>  
  11.     <url-pattern>/*</url-pattern>  
  12.   </filter-mapping>  

 

Java中应用Filter对权限和Session控制

http://happyqing.iteye.com/admin/blogs/1971981

分享到:
评论

相关推荐

    JSP高级应用

    JSP2.0在J2EE中高级应用,有过滤器,监听器和一些标签

    J2EE_MVC:最初接触J2EE时,写一个项目,二进制文件已经丢失,相关代码解释均在文档内。这是一个基于Selervlet,JSP,以及JavaBean。但没有用到监听器(Listener),过滤器(Filter),JSTL ,EL等技术,以及业务层,DAO层设计等大型项目的思想。只是一个简单的管理系统项目

    J2EE_MVC:最初接触J2EE时,写一个项目,二进制文件已经丢失,相关代码解释...但没有用到监听器(Listener),过滤器(Filter),JSTL ,EL等技术,以及业务层,DAO层设计等大型项目的思想。只是一个简单的管理系统项目

    j2ee-alliance:J2EE - 联盟桥梁计划

    j2ee联盟 J2EE - 联盟桥梁计划 活动 1 - WebApplication1(个人信息、期望、经验) 活动 2 - Java...8 - LogInOutMVCDB(Act7 与 CRUD 功能的数据库集成) 活动 9 - LogMVCFilter(添加过滤器和监听器) 活动 10 -

    基于Servlet的在线蛋糕店管理系统

    项目简介 本项目是基于J2EE的Servlet的在线蛋糕店管理系统,本项目有三种权限:游客、用户、管理员。 ...用户:浏览查看商品、...后端:Servlet、过滤器filter、监听器Listener、jdbc 前端:Jsp、Jquery、Ajax、bootstrap

    JavaWeb 开发指南 PPT课件

    14章 使用Servlet过滤器和监听器 15章 JSP Web应用的安全性 16章 Tomcat容器的JSP 17章 在JSP中使用Hibernate实现数据持久化 18章 JSP Web应用的设计与实践 19章 MVC模式实现----Struts2 20章 MVC模式实现----...

    Head First Servlet JSP(清晰中文版).part4

    《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何使用JSP表达式语言,如何部署Web应用,如何开发...13 过滤的威力:包装器和过滤器 14 企业设计模式:模式和Struts

    Head First Servlet JSP(清晰中文版).part2

    Head First Servlet JSP(清晰中文版) pdf格式 《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何...13 过滤的威力:包装器和过滤器 14 企业设计模式:模式和Struts

    Head First Servlet JSP(清晰中文版).part3

    Head First Servlet JSP(清晰中文版) pdf格式 《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何...13 过滤的威力:包装器和过滤器 14 企业设计模式:模式和Struts

    Head First Servlet JSP(清晰中文版).part1

    Head First Servlet JSP(清晰中文版) pdf格式 《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何...13 过滤的威力:包装器和过滤器 14 企业设计模式:模式和Struts

    java基础题 很全面

    8. 什么是事件监听器? 27 9. EJB 28 10. CORBA是什么?用途是什么? 29 11. Spring transaction properties 29 编程/代码 30 1. 编程题: 用最有效率的方法算出2乘以8等於几? 30 2. 我们在web应用开发过程中经常遇到...

    基于JAVA的购物网站(毕业论文)

    3.5.4 监听器类设计 26 3.6系统的用例图 27 3.6.1 总体用例分析 27 3.6.2 用户管理用例分析 28 3.6.3 购物车管理用例分析 28 小结 30 第四章 系统的详细设计 31 4.1 数据库与POJO映射的实现 31 4.2 主要模块的设计...

    基于JAVA的在线考试系统(毕业论文)

    3.5.4 监听器类设计 19 3.6系统的用例图 20 3.6.1 总体用例分析 20 3.6.2 用户管理用例分析 21 3.6.3 考试管理用例分析 21 3.6.4 考试题目管理用例分析 22 3.6.5 成绩管理用例分析 22 小结 22 第四章 系统的详细设计...

    用web.xml控制Web应用的行为

    Tomcat 10 5 初始化和预装载servlet与JSP页面 10 5.1 分配servlet初始化参数 10 5.2 分配JSP初始化参数 13 5.3 提供应用范围内的初始化参数 15 5.4 在服务器启动时装载servlet 15 6 声明过滤器 16...

    spring in action英文版

     11.4.1 代理Acegi的过滤器  11.4.2 强制Web安全性  11.4.3 处理登录  11.4.4 设置一个安全上下文  11.4.5 确保通道安全性  11.4.6 使用Acegi的标签库  11.5 保护方法调用  11.5.1 创建一个...

    Spring API

    3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一个LoadTimeWeaver 4. 资源 4.1. 简介 4.2. Resource接口 ...

    Spring中文帮助文档

    3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一个LoadTimeWeaver 4. 资源 4.1. 简介 4.2. Resource接口 ...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

Global site tag (gtag.js) - Google Analytics