首页 > 其他分享 >详细了解Servlet中过滤器和监听器的使用

详细了解Servlet中过滤器和监听器的使用

时间:2024-07-28 19:00:16浏览次数:12  
标签:调用 Servlet 监听器 过滤器 方法 onlineCount 属性

目录

一、过滤器

1.1 概念

1.2 过滤器的实现

1.3 过滤器中方法的介绍

1.4 过滤器的执行过程

二、监听器

2.1 概念

2.2 监听器的实现

2.3 不同监听器接口的介绍

1. ServletContextListener接口

2. HttpSessionListener接口

3. HttpSessionAttributeListener接口


一、过滤器

1.1 概念

过滤器是一种可以对客户端发送给服务器的请求或服务器发送给客户端的响应进行预处理和后处理的机制。它们可以用来执行诸如认证、授权、编码转换、压缩等任务。

1.2 过滤器的实现

1.先定义相关的一个类,然后实现下面两步。

  1. 实现javax.servlet.Filter接口。
  2. 实现initdoFilter, 和 destroy 方法。

代码示例

2.配置过滤器

(1)使用注解配置

(2)使用xml文件配置

配置好之后,就可以对相应的请求和响应进行拦截,过滤。

1.3 过滤器中方法的介绍

init() 方法

init()方法在过滤器首次被加载到容器中时调用。这是过滤器生命周期的第一个方法,用于进行过滤器的初始化操作。

方法的作用

  1. 初始化资源

    • 创建和初始化过滤器所需的资源,如数据库连接、缓存等。
    • 设置过滤器的配置参数。
  2. 配置过滤器

    • 根据需要配置过滤器的属性或行为。
    • 加载配置文件或设置默认值。
  3. 初始化日志记录

    • 设置日志记录级别和格式。

doFilter() 方法

doFilter()方法在每次请求通过过滤器时被调用。这是过滤器的核心方法,用于处理请求和响应。

doFilter() 方法的作用

  1. 预处理请求

    • 执行请求前的预处理操作,如认证、日志记录等。
  2. 调用下一个过滤器或目标资源

    • 调用FilterChaindoFilter()方法,让请求继续传递到下一个过滤器或最终的目标资源。
  3. 后处理响应

    • 执行响应后的处理操作,如压缩、编码转换等。

destroy() 方法

destroy()方法的作用

  1. 资源释放

    • 释放过滤器在init()方法中分配的资源,如打开的文件、数据库连接或其他外部资源。
    • 进行必要的清理工作,例如关闭线程池、释放内存等。
  2. 状态保存

    • 如果过滤器需要保存状态信息,可以在destroy()方法中进行持久化操作。
  3. 日志记录

    • 可以记录过滤器被销毁的信息,方便调试和监控。

代码演示

1.4 过滤器的执行过程

大概分为两个阶段:

  1. 请求阶段

    • 当一个请求到达Servlet容器时,容器会根据web.xml文件或注解配置找到与请求URL模式匹配的所有过滤器。
    • 过滤器按照配置的顺序依次调用doFilter()方法。
    • 每个过滤器执行预处理逻辑,然后调用FilterChain.doFilter(request, response)方法将请求传递给下一个过滤器或目标资源。
    • 如果一个过滤器阻止了请求的传递(例如重定向或返回响应),则请求不会传递给后续的过滤器或目标资源。
  2. 响应阶段

    • 当请求处理完毕,生成响应时,容器会按照过滤器配置的逆序调用每个过滤器的doFilter()方法。
    • 过滤器执行后处理逻辑,如添加响应头、修改响应内容等。
    • 最后一个过滤器完成后,响应被发送回客户端。

二、监听器

2.1 概念

监听器是一种可以监听容器事件的机制,如应用程序启动或关闭、HTTP会话创建或销毁等。监听器允许开发者在这些事件发生时执行特定的动作。

2.2 监听器的实现

1.先定义监听器,创建一个类,然后实现下面两步。

  1. 实现相应的监听器接口,例如ServletContextListenerHttpSessionListener,HttpSessionAttributeListener,不同的接口实现的功能不同。
  2. 实现监听器接口中的方法,如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接口

(1)HttpSessionAttributeListener用于监听HttpSession中属性的变化。

  • attributeAdded(HttpSessionBindingEvent event)

    • 当新的属性被添加到HttpSession时调用。
    • 可以记录新属性的添加,或者执行其他与属性添加相关的操作。
  • attributeRemoved(HttpSessionBindingEvent event)

    • 当属性从HttpSession中被删除时调用。
    • 可以记录属性的删除,或者执行其他与属性删除相关的操作。
  • attributeReplaced(HttpSessionBindingEvent event)

    • HttpSession中的属性被替换时调用。
    • 可以记录属性的替换,或者执行其他与属性替换相关的操作。

(2)应用场景:

  • 监听会话属性的变化。
  • 日志记录,记录何时何地添加、删除或替换了会话属性。
  • 资源管理,跟踪会话属性的生命周期,以便在属性被删除时释放相关资源。
  • 统计和监控,收集有关会话属性变化的数据,用于统计分析或监控会话的状态。

标签:调用,Servlet,监听器,过滤器,方法,onlineCount,属性
From: https://blog.csdn.net/qq_62555748/article/details/140741332

相关文章

  • 如何向 python pandas 数据透视表添加过滤器? (pd.read_excel)
    我正在尝试使用pandas库在python中重新创建我在Excel中制作的数据透视表。我试图用时间段作为过滤器来总结超过500k行的OD总行程数据。在Excel上,我只会执行行(O)、列(D)、值(行程)、过滤器(时间)。到目前为止,在python上我只有索引、列、值、aggfunc,但我不知道如何过滤。有......
  • JavaWeb开发基础Servlet API
    Servlet版本Oracle将JavaEE(JavaSE还自己保留)交给开源组织,Eclipse基金会接手。但Oracle不允许开源组织使用Java名号,所以JakartaEE名称于2018.02.26应运而生。正是因为组织变化,Servlet被割裂为了2个版本,javax.servlet和jakarta.servlet。javax.servlet已经停止维护,但它仍然是......
  • SpringBoot中使用监听器
    1.定义一个事件/***定义事件*@authorhrui*@date2024/7/2512:46*/publicclassCustomEventextendsApplicationEvent{privateStringmessage;publicCustomEvent(Objectsource,Stringmessage){super(source);this.message......
  • Servlet 超详细快速入门(详解 看这一篇就够了)
    1.Servlet介绍1.1 什么是Servlet  Servlet是ServerApplet的简称,是用Java编写的是运行在Web服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet,可以收集来自网页表单的用户输入,呈现来自......
  • SpringBoot源码初学者(二):SpringBoot事件监听器
    ps:真正适合阅读源码的新手来看的SpringBoot源码讲解,如果你真的想读懂SpringBoot源码,可以按照以下推荐的方式来阅读文章打开ide,打开SpringBoot源码,跟着文章一起写注释,写自己的注释不要过于纠结没讲到的地方,毕竟SpringBoot源码那么多,想全讲完是不可能的,只要跟着文章认真阅......
  • 【漏洞复现】用友 NC FileReceiveServlet 任意文件上传漏洞
    免责声明:        本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规......
  • JavaWed过滤器和监听器(知识回顾+详解)
    过滤器 Filter   1.1概念       在浏览器和目标资源之间进行过滤的中间组件。       请求到达目标资源之前进行过滤。       响应到达浏览器之前进行过滤。   1.2定义过滤器的步骤      1.写一个java类,实现Filter接口   ......
  • 高并发场景下,布隆过滤器+缓存基本步骤
    在高并发场景下,布隆过滤器与缓存的结合使用可以显著提升系统的响应速度和降低后端数据库的负载。以下是布隆过滤器与缓存(如Redis)结合使用的一般配置步骤和原理:1.原理布隆过滤器作为预检查:在查询缓存或数据库之前,先使用布隆过滤器检查请求的键是否可能存在于缓存或数据库中......
  • JavaWeb Servlet
    Servlet入门Servlet是Java提供的一门动态web资源开发技术。简而言之,不同用户访问同样的资源会看到不一样的效果。Servlet是JavaEE规范之一,其实是一个接口。1快速入门1.1创建web项目,导入Servlet依赖坐标<dependency><groupId>javax.servlet</groupId>......
  • servlet化学实验交流平台-计算机毕业设计源码13069
    目录摘要Abstract第一章绪论1.1选题背景及意义1.2国内外研究现状1.3研究方法第二章相关技术介绍2.1Java编程语言2.2B/S模式2.3MySQL简介2.4Serrvlet框架2.5Vue介绍第三章化学实验交流平台分析3.1系统目标3.2可行性分析3.2.1技术......