欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaEE Filter和Listener 分析

程序员文章站 2022-03-04 18:53:10
...
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 过期。
相关标签: javaEE