`

java 监听器过滤器

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

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


•ServletContex监听器

ServletContex又叫application,存在范围是整个Servlet容器生命周期,当系统启动时就会创建,系统关闭时会销毁,该对象通常存放一些非常通用的数据,但是不推荐存放太多,否则长期占据内存空间会影响服务器性能。

基于ServletContex的监听器可以继承两个接口并实现接口中相应的方法:

ServletContextListener接口定义了两个方法contextInitialized和contextDestroyed,分别在ServletContex创建和销毁时触发;

ServletContextAttributeListener接口定义了三个方法attributeAdded,attributeRemoved和attributeReplaced,分别在给ServletContex添加属性值,删除属性值和替换属性值时触发。

下面创建了一个基于Application的监听器:





Java代码 复制代码 收藏代码
1. /**
2. * Application监听器,Servlet中的Application即ServletContext
3. * @author Administrator
4. */ 
5.public class ApplicationListener implements ServletContextListener, 
6.        ServletContextAttributeListener { 
7.     
8.    /**
9.     * application销毁时触发的事件
10.     */ 
11.    @Override 
12.    public void contextDestroyed(ServletContextEvent arg0) { 
13.        System.out.println("Application销毁:"+arg0.getServletContext()); 
14.    } 
15.     
16.    /**
17.     * application初始化时触发的方法
18.     */ 
19.    @Override 
20.    public void contextInitialized(ServletContextEvent arg0) { 
21.        System.out.println("Application创建:"+arg0.getServletContext()); 
22.    } 
23.     
24.    /**
25.     * application中添加属性值时触发的方法
26.     */ 
27.    @Override 
28.    public void attributeAdded(ServletContextAttributeEvent arg0) { 
29.        System.out.println("Application添加新属性:key="+arg0.getName()+"  value="+arg0.getValue()); 
30.    } 
31.     
32.    /**
33.     * application中删除属性值时触发的方法
34.     */ 
35.    @Override 
36.    public void attributeRemoved(ServletContextAttributeEvent arg0) { 
37.        System.out.println("Application移除属性:key="+arg0.getName()+"  value="+arg0.getValue()); 
38.    } 
39.     
40.    /**
41.     * application中替换属性值时触发的方法
42.     */ 
43.    @Override 
44.    public void attributeReplaced(ServletContextAttributeEvent arg0) { 
45.        System.out.println("Application替换属性:key="+arg0.getName()+"  value="+arg0.getValue()); 
46.    } 
47. 
48.} 




最后在web.xml需要注册监听器,注册方式非常简单,注意标签<description>和<display-name>不是必须的:





Xml代码 复制代码 收藏代码
1.<listener> 
2.    <description>application listener</description> 
3.    <display-name>application_listener</display-name> 
4.    <listener-class>com.bless.listener.application.ApplicationListener</listener-class> 
5.</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监听器和过滤器详解

    ### Java监听器和过滤器详解 #### 监听器概念及分类 监听器在Java Web开发中扮演着非常重要的角色,主要用于监听特定容器事件的发生,比如服务器对象的创建与销毁等,并根据这些事件做出相应的处理。它的工作原理...

    java 过滤器和监听器 java 过滤器和监听器

    java 过滤器和监听器

    java监听器

    总的来说,Java监听器和过滤器是Java编程中重要的概念,它们帮助我们构建响应用户交互、管理应用程序状态和控制网络通信等功能。理解并熟练运用这些机制对于提升Java应用程序的用户体验和功能完整性至关重要。

    JAVA USB监听器

    【JAVA USB监听器】是一种基于Java编程语言实现的软件工具,其主要功能是对USB设备进行实时监控,当USB设备插入时,能够自动检测并复制指定类型的文件到预先设定的目录中。这种工具对于需要频繁从USB设备中获取特定...

    过滤器和监听器的使用与区别

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两种非常重要的组件,它们主要用于增强应用程序的功能和管理应用程序的状态。本篇文章将详细解释这两种技术的使用、配置及其区别。 首先,我们来了解过滤...

    javaEE(上下文_监听器_过滤器) ppt

    Java EE(Java Platform, Enterprise Edition)是用于构建企业级分布式应用程序的框架,它提供了一系列标准接口和组件模型,包括上下文、监听器和过滤器。这些概念是Java EE开发中的核心组成部分,对于理解和优化Web...

    过滤器和监听器教程(java)

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们主要用于增强应用程序的功能和管理应用程序的生命周期。本教程将深入探讨这两个核心组件,以帮助开发者更好地理解和应用它们。 ...

    jsp/servlet中过滤器和监听器的区别

    理解并熟练使用过滤器和监听器对于开发高质量的Java Web应用至关重要。它们可以提高代码的可维护性、可扩展性和安全性,同时也能帮助开发者更好地管理应用程序的状态。在实际开发中,应根据需求选择合适的技术,以...

    关于监听器Listener和过滤器的小demo

    在Java Web开发中,监听器(Listener)和过滤器(Filter)是两个非常重要的概念,它们主要用于增强应用程序的功能和性能。下面将详细讲解这两个概念及其应用。 ### 监听器(Listener) 监听器是实现特定接口的Java...

    javaweb_高级_过滤器_监听器

    要创建一个过滤器,首先需要编写一个实现`Filter`接口的Java类,并重写`doFilter()`方法。然后在`web.xml`配置文件中指定过滤器的有效路径,使得当请求匹配到这些路径时,过滤器会被触发。`doFilter()`方法中有三个...

    关于过滤器和监听器的使用模板

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的组件,它们主要用于增强应用程序的功能和管理应用程序的状态。以下是关于这两个概念的详细说明。 **过滤器(Filter)** 过滤器是Servlet...

    监听器访问计数过滤非法字符

    总之,监听器和过滤器是Java Web开发中的核心组件,它们可以帮助我们实现复杂的功能,如在线人数统计和数据安全过滤。通过合理地设计和使用这些组件,我们可以提升Web应用的性能和安全性,为用户提供更优质的体验。

    java字符编码监听器

    Java字符编码监听器是Java Web开发中的一个重要概念,主要用于处理HTTP请求和响应中的字符编码问题。在Java Servlet规范中,提供了`SetCharacterEncodingFilter`这样的过滤器,用于确保请求参数和响应内容的正确编码...

    监听器 过滤器 详解

    在Java Web开发中,监听器(Listeners)和过滤器(Filters)是两个非常重要的概念,它们主要用于增强应用程序的功能和性能。这两个组件都是Servlet规范的一部分,能够帮助开发者在Web应用程序的不同阶段进行介入,...

    java过滤器、监听器拦截器原理个人总结.pdf

    Java 过滤器、监听器拦截器原理个人总结 Java 过滤器是 Java Servlet 规范中的一种机制,用于对请求和响应进行过滤。过滤器可以实现用户身份验证、日志记录、数据压缩等功能。创建一个过滤器需要两个步骤:创建 ...

    java核心技术-java中监听器和过滤器的使用笔记

    Java核心技术中的监听器和过滤器是Web开发中的关键组件,主要应用于Servlet容器中,用于增强应用程序的功能和控制请求与响应的处理流程。本篇将详细阐述Java中的Filter(过滤器)及其使用方法。 1. **Filter(过滤...

    servlet中的过滤器与监听器

    在Servlet技术中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们帮助开发者实现对请求和响应的拦截、处理以及管理应用程序的状态。 ### 1. Servlet过滤器 **过滤器** 是Servlet API提供的一种...

    java web过滤器案列

    总结来说,这个Java Web案例通过过滤器实现了自动登录功能,利用监听器实现了用户踢出机制,并解决了字符编码问题。这些技术的应用展示了Java Web的强大和灵活性,为构建安全、高效和用户体验良好的Web应用提供了...

    过滤器filter和监听器listener的应用总结

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们主要用于增强应用程序的功能和管理应用程序的状态。这篇文章将对这两者的应用进行深入的总结。 **过滤器Filter** 过滤器是在...

    过滤器和监听器的使用

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们主要用于增强应用程序的功能和管理应用程序的生命周期。过滤器主要负责对HTTP请求和响应进行拦截和处理,而监听器则用来监听和...

Global site tag (gtag.js) - Google Analytics