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() 方法由容器在销毁过滤器实例之前调用:。
2. Listener 是基于观察者模式设计的,Listener 的设计对开发 Servlet 应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据。目前 Servlet 中提供了 5 种两类事件的观察者接口,它们分别是:4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener。
统计在线人数的实例
3. 解决浏览器关闭时,不调用sessionDestroyed() 方法的方案
essionDestroyed方法在以下两种情况下会调用:
A.session过期。
B.调用session.invalidate()方法。
因此可以在浏览器中监听浏览器的关闭事件,在关闭前,让服务器发送请求,调用某方法 使当前session 过期。
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 过期。
上一篇: LeetCode 1207 哈希表
下一篇: php正则如何不包含某字符串
推荐阅读
-
Java:Listener和Filter
-
JAVAEE——宜立方商城06:Redis安装、数据类型和持久化方案、Redis集群分析与搭建、实现缓存和同步
-
Filter过滤器和Listener监听器详解
-
JAVAEE——BOS物流项目09:业务受理需求分析、创建表、实现自动分单、数据表格编辑功能使用方法和工作单快速录入
-
JavaWeb学习笔记之Filter和Listener
-
Tomcat 源码分析(三)-(二)-WEB应用中的Listener、Filter、Servlet 的加载和调用
-
JavaEE-Servlet-Filter和Listener
-
Servlet、Filter 和 Listener 调用顺序、生命周期的实验分析
-
javaEE(Listener监听器和Filter过滤器)
-
Java:Listener和Filter