目录
3. HttpSessionAttributeListener接口
一、过滤器
1.1 概念
过滤器是一种可以对客户端发送给服务器的请求或服务器发送给客户端的响应进行预处理和后处理的机制。它们可以用来执行诸如认证、授权、编码转换、压缩等任务。
1.2 过滤器的实现
1.先定义相关的一个类,然后实现下面两步。
- 实现
javax.servlet.Filter
接口。- 实现
init
,doFilter
, 和destroy
方法。
代码示例
2.配置过滤器
(1)使用注解配置
(2)使用xml文件配置
配置好之后,就可以对相应的请求和响应进行拦截,过滤。
1.3 过滤器中方法的介绍
init()
方法
init()
方法在过滤器首次被加载到容器中时调用。这是过滤器生命周期的第一个方法,用于进行过滤器的初始化操作。方法的作用
初始化资源:
- 创建和初始化过滤器所需的资源,如数据库连接、缓存等。
- 设置过滤器的配置参数。
配置过滤器:
- 根据需要配置过滤器的属性或行为。
- 加载配置文件或设置默认值。
初始化日志记录:
- 设置日志记录级别和格式。
doFilter()
方法
doFilter()
方法在每次请求通过过滤器时被调用。这是过滤器的核心方法,用于处理请求和响应。
doFilter()
方法的作用
预处理请求:
- 执行请求前的预处理操作,如认证、日志记录等。
调用下一个过滤器或目标资源:
- 调用
FilterChain
的doFilter()
方法,让请求继续传递到下一个过滤器或最终的目标资源。后处理响应:
- 执行响应后的处理操作,如压缩、编码转换等。
destroy()
方法
destroy()
方法的作用
资源释放:
- 释放过滤器在
init()
方法中分配的资源,如打开的文件、数据库连接或其他外部资源。- 进行必要的清理工作,例如关闭线程池、释放内存等。
状态保存:
- 如果过滤器需要保存状态信息,可以在
destroy()
方法中进行持久化操作。日志记录:
- 可以记录过滤器被销毁的信息,方便调试和监控。
代码演示
1.4 过滤器的执行过程
大概分为两个阶段:
请求阶段:
- 当一个请求到达Servlet容器时,容器会根据
web.xml
文件或注解配置找到与请求URL模式匹配的所有过滤器。- 过滤器按照配置的顺序依次调用
doFilter()
方法。- 每个过滤器执行预处理逻辑,然后调用
FilterChain.doFilter(request, response)
方法将请求传递给下一个过滤器或目标资源。- 如果一个过滤器阻止了请求的传递(例如重定向或返回响应),则请求不会传递给后续的过滤器或目标资源。
响应阶段:
- 当请求处理完毕,生成响应时,容器会按照过滤器配置的逆序调用每个过滤器的
doFilter()
方法。- 过滤器执行后处理逻辑,如添加响应头、修改响应内容等。
- 最后一个过滤器完成后,响应被发送回客户端。
二、监听器
2.1 概念
监听器是一种可以监听容器事件的机制,如应用程序启动或关闭、HTTP会话创建或销毁等。监听器允许开发者在这些事件发生时执行特定的动作。
2.2 监听器的实现
1.先定义监听器,创建一个类,然后实现下面两步。
- 实现相应的监听器接口,例如
ServletContextListener
、HttpSessionListener,
HttpSessionAttributeListener,不同的接口实现的功能不同。- 实现监听器接口中的方法,如contextInitialized,contextDestroyed,sessionCreated,sessionDestroyed等。
以继承 HttpSessionAttributeListener 接口为例,代码演示如下
2.在web.xml
文件中配置监听器,或者使用注解@WebListener
。
(1)web.xml配置如下:
<listener>
<listener-class>com.example.UserCounterListener</listener-class>
</listener>
(2)使用注解配置如下
案例:
下面是一个简单的监听器示例,该监听器用于统计在线用户数量。
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.annotation.WebListener;
@WebListener
public class UserCounterListener implements HttpSessionListener, HttpSessionAttributeListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// 当新会话创建时增加在线用户计数
int onlineCount = (int) se.getSession().getServletContext().getAttribute("onlineCount");
onlineCount++;
se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 当会话销毁时减少在线用户计数
int onlineCount = (int) se.getSession().getServletContext().getAttribute("onlineCount");
onlineCount--;
se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
// 当会话属性添加时执行
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// 当会话属性移除时执行
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
// 当会话属性替换时执行
}
}
2.3 不同监听器接口的介绍
1. ServletContextListener接口
(1)ServletContextListener
用于监听ServletContext
的创建和销毁事件。
contextInitialized(ServletContextEvent sce)
:
- 当Web应用被部署并且
ServletContext
被初始化时调用。- 在这个方法中可以进行一些初始化操作,比如设置全局变量、加载配置文件等。
contextDestroyed(ServletContextEvent sce)
:
- 当Web应用被卸载或
ServletContext
被销毁时调用。- 在这个方法中可以执行清理资源的操作,如关闭数据库连接、释放内存资源等。
(2)应用场景:
- 应用程序级别的初始化和配置。
- 全局变量的设置。
- 初始化资源,如数据库连接池、缓存等。
- 记录应用程序的启动和关闭日志。
2. HttpSessionListener接口
(1)HttpSessionListener
用于监听HttpSession
的创建和销毁事件。
sessionCreated(HttpSessionEvent se)
:
- 当新的
HttpSession
被创建时调用。- 可以在这个方法中记录新会话的创建,或者设置会话的初始状态。
sessionDestroyed(HttpSessionEvent se)
:
- 当
HttpSession
被销毁时调用。- 可以在这个方法中清理会话相关的资源,如关闭与会话相关的数据库连接或释放内存资源。
(2)应用场景:
- 用户会话的创建和销毁。
- 统计在线用户数量。
- 自动注销长时间未活动的用户。
- 会话级别的初始化和清理。
3. HttpSessionAttributeListener接口
标签:调用,Servlet,监听器,过滤器,方法,onlineCount,属性 From: https://blog.csdn.net/qq_62555748/article/details/140741332
(1)HttpSessionAttributeListener
用于监听HttpSession
中属性的变化。
attributeAdded(HttpSessionBindingEvent event)
:
- 当新的属性被添加到
HttpSession
时调用。- 可以记录新属性的添加,或者执行其他与属性添加相关的操作。
attributeRemoved(HttpSessionBindingEvent event)
:
- 当属性从
HttpSession
中被删除时调用。- 可以记录属性的删除,或者执行其他与属性删除相关的操作。
attributeReplaced(HttpSessionBindingEvent event)
:
- 当
HttpSession
中的属性被替换时调用。- 可以记录属性的替换,或者执行其他与属性替换相关的操作。
(2)应用场景:
- 监听会话属性的变化。
- 日志记录,记录何时何地添加、删除或替换了会话属性。
- 资源管理,跟踪会话属性的生命周期,以便在属性被删除时释放相关资源。
- 统计和监控,收集有关会话属性变化的数据,用于统计分析或监控会话的状态。