`
TRAMP_ZZY
  • 浏览: 138852 次
社区版块
存档分类
最新评论

JavaEE Filter和Listener 分析

阅读更多
1. Filter 使程序可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chain”。
  Filter 会在ServletContext 初始化之后,被调用 init()方法初始化。doFilter()会在每次请求被拦截时调用。
Filter destroy() 方法由容器在销毁过滤器实例之前调用:。
package cn.mybatis.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.annotation.WebFilter;

/**
 * Servlet Filter implementation class LoginFilter
 */

public class LoginFilter implements Filter {

	private FilterConfig filterConfig;
	
    /**
     * Default constructor. 
     */
    public LoginFilter() {
        // TODO Auto-generated constructor stub
    }


	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		this.filterConfig = fConfig;
		System.out.println("init methid getFilterConfig");
	}
    
	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		System.out.println("destroy method");
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter method");
		chain.doFilter(request, response);
	}


}


2. Listener 是基于观察者模式设计的,Listener 的设计对开发 Servlet 应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据。目前 Servlet 中提供了 5 种两类事件的观察者接口,它们分别是:4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener。

统计在线人数的实例
package cn.mybatis.servlet;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * Application Lifecycle Listener implementation class OnlineUserListener
 *
 */
@WebListener
public class OnlineUserListener implements HttpSessionListener, 
					ServletContextListener, ServletContextAttributeListener {
	private long onlineUserCount = 0;
	
    /**
     * Default constructor. 
     */
    public OnlineUserListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent arg0) {
    	
      System.out.println("contextInitialized");
    }

	/**
     * @see ServletContextAttributeListener#attributeAdded(ServletContextAttributeEvent)
     */
    public void attributeAdded(ServletContextAttributeEvent arg0) {
        System.out.println("attributeAdded");
    }

	/**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent arg0) {
        this.onlineUserCount ++;
        toUpadteCount(arg0);
        System.out.println("sessionCreated");
    }

	/**
     * @see ServletContextAttributeListener#attributeReplaced(ServletContextAttributeEvent)
     */
    public void attributeReplaced(ServletContextAttributeEvent arg0) {
        System.out.println("attributeReplaced");
    }

	/**
     * @see ServletContextAttributeListener#attributeRemoved(ServletContextAttributeEvent)
     */
    public void attributeRemoved(ServletContextAttributeEvent arg0) {
        // TODO Auto-generated method stub
    }

	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent arg0) {
       this.onlineUserCount --;
       toUpadteCount(arg0);
       System.out.println("sessionDestroyed");
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
    }
    
    private void toUpadteCount(HttpSessionEvent httpSessionEvent) {
    	httpSessionEvent.getSession().getServletContext().setAttribute("onlineUserCount", onlineUserCount);
    	//httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);
    }
    
	
}


3. 解决浏览器关闭时,不调用sessionDestroyed() 方法的方案
essionDestroyed方法在以下两种情况下会调用:
   A.session过期。
   B.调用session.invalidate()方法。
   因此可以在浏览器中监听浏览器的关闭事件,在关闭前,让服务器发送请求,调用某方法        使当前session 过期。
分享到:
评论

相关推荐

    servlet+filter+listener 详解

    Servlet、Filter 和 Listener 是 JavaEE 中三种重要的组件,它们在 Web 开发中扮演着重要的角色。Servlet 负责处理客户端的请求,Filter 负责过滤和拦截 Web 资源,而 Listener 负责监听Servlet 容器中的事件。

    java_web_第9章_Filter与Listener.ppt

    11.1 Web应用的事件模型 11.2 Web应用的过滤器 11.3 小 结 11.1.1 事件与监听器接口 11.1.2 监听环境事件 11.1.3 监听请求事件 11.1.4 监听会话事件 11.1.5 事件监听器的注册

    JavaEE期末复习模拟题

    10. **Filter和Listener**:在JavaEE中,Filter用于拦截和处理HTTP请求,而Listener监听特定的事件,如session创建或销毁。 11. **部署描述符**:如web.xml和ejb-jar.xml,它们定义了应用的配置信息,包括组件的...

    javaEE程序开发

    11. **Filter和Listener**:在JavaEE中,Filter和Listener是用于扩展Web应用程序功能的关键组件。Filter可以拦截请求和响应,而Listener可以监听特定的事件,如会话创建或销毁。 学习JavaEE程序开发不仅需要掌握...

    javaEE源代码servlet框架

    通过分析这个"javaEE源代码servlet框架",你可以学习到如何编写和配置Servlet,以及它们如何与XML配置文件、Filter和Listener一起工作,这对于深入理解JavaEE应用开发至关重要。此外,实践项目中的源代码将帮助你更...

    javaEE知识点复习资料

    11. **Filter和Listener**:它们是JavaEE中增强应用功能的关键工具。Filter可以拦截和处理请求或响应,Listener则监听特定的事件,如session创建或销毁。 12. **Spring框架**:虽然不是JavaEE标准的一部分,但...

    javaee源代码

    JavaEE(Java Platform, Enterprise Edition)是Oracle公司提供的一个用于构建企业级Web应用程序的框架标准。...通过学习和分析源码,开发者可以更好地适应企业级开发环境,解决实际项目中的问题。

    javaEE小代码

    9. **Filter和Listener**:在web.xml中配置Filter和Listener可以扩展JavaEE应用的功能。Filter可以拦截请求,进行预处理或后处理,而Listener则可以监听特定事件,如session的创建和销毁。 10. **RESTful API**:...

    jsp javaee 后台模板

    6. **Filter和Listener**:Filter用于拦截和处理请求,Listener监听应用中的特定事件,两者都增强了应用的功能和灵活性。 7. **部署描述符(Deployment Descriptor)**:如web.xml,定义了应用的配置信息,如...

    JavaEE的压缩包text

    11. **Filter 和 Listener**:在JavaEE中,Filter用于拦截和处理Servlet请求和响应,而Listener则监听特定的Web或Servlet事件。 12. **MVC(Model-View-Controller)**架构模式:虽然JavaEE本身不强制使用特定的MVC...

    JavaEE综合练习项目-快递e栈源码

    JavaEE综合练习项目,涉及:html、css、js、Jquery、bootstrap、layui、layer、ajax、mysql、tomcat、servlet、filter、listener、jsp和公有云服务器。

    图书馆系统(JAVAEE)

    7. **部署配置**:项目可能使用了Web.xml文件来配置应用服务器,如Tomcat或WildFly,定义Servlet、Filter和Listener等。 此外,图书馆系统还可能涉及到其他特性,如数据验证、事务管理、日志记录、错误处理等。使用...

    JAVAEE5API

    它增强了Servlet的生命周期管理,提供了过滤器(Filter)和监听器(Listener)的更多功能,并支持动态部署。Servlet API允许开发者处理HTTP请求,实现服务器端逻辑。 2. **JSP 2.1**: JavaServer Pages(JSP)2.1...

    JavaEE实验源码

    5. **Filter和Listener**:学习者可能会接触Web应用的过滤器和监听器,了解它们如何增强应用的功能和控制流程。 6. **部署和测试**:实验可能包含将应用部署到应用服务器(如Tomcat或WildFly),以及编写和执行单元...

    javaEE知识脉络.pdf

    JavaEE的核心在于其提供的一系列技术和API(Application Programming Interface),这些技术和API使得开发者可以轻松地构建复杂的企业级应用。 #### 二、JavaEE关键技术点 ##### 1. XHTML (Extensible HyperText ...

    javaee之信息管理后台

    JavaEE信息管理后台是一个基于JSP(JavaServer Pages)和Servlet技术开发的Web应用程序,它采用了经典的三层架构模式,即表现层、业务逻辑层和数据访问层,来实现高效、可维护的信息管理系统。这个项目是Java初学者...

    javaee第五章源代码

    JavaEE是企业级应用开发的重要框架,主要用于构建分布式、组件化的Web应用程序。在第五章的学习中,我们将...通过分析和实践这些代码,你将更深入地理解JavaEE的运行机制,并能够构建出更高效、更健壮的企业级应用。

    JavaEE基础笔记.zip

    10. **Filter和Listener**:它们是JavaEE中的重要辅助组件,Filter用于在请求到达目标资源前进行拦截处理,Listener则用于监听特定的事件,如会话创建、销毁等。 这些基础知识构成了JavaEE开发的基石,掌握它们能...

    学习JavaEE的day22

    5. **Filter和Listener**:这两个组件是JavaEE的高级特性,用于拦截请求和监听特定事件。Filter可以用来进行数据过滤、登录验证等,Listener则可以监听session、request等对象的生命周期事件。 6. **数据库连接和...

    学习JavaEE的day07

    8. **Filter与Listener**:在JavaEE中,过滤器(Filter)和监听器(Listener)是增强Web应用功能的重要工具。Filter可以用来拦截请求和响应,实现如登录验证、GZIP压缩等功能;Listener则可以监听特定事件,如...

Global site tag (gtag.js) - Google Analytics