当前位置: 首页 > article >正文

JAVAweb之过滤器,监听器

文章目录

  • 过滤器
    • 认识
    • 生命周期
    • FilterConfig
    • FilterChain
    • 过滤器执行顺序
    • 应用场景
    • 代码
  • 监听器
    • 认识
    • ServletContextListener
    • HttpSessionListener
    • ServletRequestListener
    • 代码

过滤器

认识

Java web三大组件之一,与Servlet相似。过滤器是用来拦截请求的,而非处理请求。

当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,才会接着执行用户请求的Servlet(或者接着执行其它的Filter)。

过滤器需要实现Filter接口,其源码如下:

public interface Filter {void init(FilterConfig var1) throws ServletException;void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;void destroy();
}

生命周期

  • void init(FilterConfig var1):在服务器启动时会创建Filter实例,并且每个类型的Filter只有一个实例。创建完实例后,会马上执行init()方法完成初始化工作,且这个方法只会执行一次。
  • doFilter(ServletRequest req,ServletResponse res,FilterChain chain):这个方法会在用户访问“目标资源时”(index.jsp)时执行。如果需要放行,则执行FilterChain var3的doFilter(ServletRequest,ServletResponse)方法;如果不需要放心,则不调用该方法,目标资源则无法访问。
  • destroy():服务器会在创建Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁它。一般会在服务器关闭时销毁Filter对象,在销毁Filter对象之前,服务器会调用Filter对象的destory()方法。

FilterConfig

Filter接口中的init()方法的参数类型为FilterConfig类型,它的功能与ServletConfig相似,与web.xml文件中的配置信息对应。下面是FilterConfig的功能介绍:

  • ServletContext getServletContext():获取ServletContext的方法;

  • String getFilterName():获取Filter的配置名称;与元素对应;

  • String getInitParameter(String name):获取Filter的初始化配置,与元素对应;

  • Enumeration getInitParameterNames():获取所有初始化参数的名称。

<filter><filter-name>FliterOne</filter-name><filter-class>com.luxiya.konghua.FliterOne</filter-class><init-param><param-name>name</param-name><param-value>luxiya</param-value></init-param><init-param><param-name>age</param-name><param-value>18</param-value></init-param>
</filter>
<filter-mapping><filter-name>FliterOne</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>public class FliterOne implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器一初始化");String filterName = filterConfig.getFilterName();System.out.println("过滤器名称:" + filterName);String name = filterConfig.getInitParameter("name");System.out.println("过滤器参数名称:" + name);Enumeration<String> names = filterConfig.getInitParameterNames();while (names.hasMoreElements()){String name = names.nextElement();String value = filterConfig.getInitParameter(name);System.out.println("元素:" + name + "  过滤器值:" + value);}}----------------结果-----------------    
过滤器一初始化
过滤器名称:FliterOne
过滤器参数名称:luxiya
元素:name  过滤器值:luxiya
元素:age  过滤器值:18

FilterChain

doFilter()方法的参数中有一个类型为FilterChain的参数,它只有一个方法:doFilter(ServletRequest,ServletResponse)。

一个目标资源上,可能部署了多个过滤器,如果当前过滤器是最后一个过滤器,那么调用chain.doFilter()方法表示执行目标资源,而不是最后一个过滤器,那么chain.doFilter()表示执行下一个过滤器的doFilter()方法。

过滤器执行顺序

  • web.xml:一个目标资源可以指定多个过滤器,过滤器的执行顺序是在web.xml文件中的部署顺序。

  • 注释:

    在 Servlet 3.0 及以上版本中,可以使用 @WebFilter 注解来配置过滤器。此时,过滤器的执行顺序由 @Order 注解或 @Priority 注解来决定。

    @Order 注解的值越小,优先级越高,过滤器会先执行;@Priority 注解的值越小,优先级也越高,过滤器先执行。

应用场景

  • 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;

  • 通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;

  • 在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理

代码

---------------------过滤器一-------------------
public class FliterOne implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器一初始化");String filterName = filterConfig.getFilterName();System.out.println("过滤器名称:" + filterName);String root = filterConfig.getInitParameter("name");System.out.println("过滤器根路径:" + root);Enumeration<String> names = filterConfig.getInitParameterNames();while (names.hasMoreElements()){String name = names.nextElement();String value = filterConfig.getInitParameter(name);System.out.println("元素:" + name + "  过滤器值:" + value);}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=UTF-8");System.out.println("过滤器一检测中");filterChain.doFilter(servletRequest,servletResponse);System.out.println("过滤器一检测后");}@Overridepublic void destroy() {System.out.println("过滤器一销毁");}
}
---------------------过滤器二-------------------
public class FilterTwo implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("过滤器二检测中");filterChain.doFilter(servletRequest,servletResponse);System.out.println("过滤器二检测后");}@Overridepublic void destroy() {}
}
---------------------web.xml-------------------<filter><filter-name>FliterOne</filter-name><filter-class>com.luxiya.konghua.FliterOne</filter-class><init-param><param-name>name</param-name><param-value>luxiya</param-value></init-param><init-param><param-name>age</param-name><param-value>18</param-value></init-param></filter><filter-mapping><filter-name>FliterOne</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>FilterTwo</filter-name><filter-class>com.luxiya.konghua.FilterTwo</filter-class></filter><filter-mapping><filter-name>FilterTwo</filter-name><url-pattern>/*</url-pattern></filter-mapping>---------------------结果-------------------
过滤器一初始化
过滤器名称:FliterOne
过滤器根路径:luxiya
元素:name  过滤器值:luxiya
元素:age  过滤器值:18过滤器一检测中
过滤器二检测中Hello Servlet,我执行了HelloServlet过滤器二检测后
过滤器一检测后

监听器

认识

在JavaWeb被监听的事件源为:ServletContext、HttpSession、ServletRequest,即三大域对象。

  • 监听域对象“创建”与“销毁”的监听器;

  • 监听域对象“操作域属性”的监听器;

  • 监听HttpSession的监听器。

ServletContextListener

ServletContextListener:Tomcat启动和关闭时调用下面两个方法:

  • public void contextInitialized(ServletContextEvent evt):ServletContext对象被创建后调用;

  • public void contextDestroyed(ServletContextEvent evt):ServletContext对象被销毁前调用;

HttpSessionListener

HttpSessionListener:开始会话和结束会话时调用下面两个方法

  • public void sessionCreated(HttpSessionEvent evt):HttpSession对象被创建后调用;

  • public void sessionDestroyed(HttpSessionEvent evt):HttpSession对象被销毁前调用;

ServletRequestListener

ServletRequestListener:开始请求和结束请求时调用下面两个方法

  • public void requestInitiallized(ServletRequestEvent evt):ServletRequest对象被创建后调用;

  • public void requestDestroyed(ServletRequestEvent evt):ServletRequest对象被销毁前调用。

代码

public class Listener implements ServletContextListener, HttpSessionListener, ServletRequestListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("监听器初始化---ServletContext对象被创建后调用");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("监听器销毁---ServletContext对象被销毁后调用");}@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {System.out.println("监听器销毁---ServletRequest对象被销毁后调用");}@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {System.out.println("监听器初始化---ServletRequest对象被创建后调用");}@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {System.out.println("监听器初始化---HttpSession对象被创建后调用");}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {System.out.println("监听器销毁---HttpSession对象被销毁后调用");}
}
-------------------结果----------------
监听器初始化---ServletContext对象被创建后调用
过滤器一初始化
过滤器名称:FliterOne
过滤器根路径:luxiya
元素:name  过滤器值:luxiya
元素:age  过滤器值:18
[2025-02-25 08:31:10,220] Artifact fliter_listener:war exploded: Artifact is deployed successfully
[2025-02-25 08:31:10,220] Artifact fliter_listener:war exploded: Deploy took 226 milliseconds
监听器初始化---ServletRequest对象被创建后调用
过滤器一检测中
过滤器二检测中
监听器初始化---HttpSession对象被创建后调用(第一次请求才有)
Hello Servlet,我执行了HelloServlet
过滤器二检测后
过滤器一检测后
监听器销毁---ServletRequest对象被销毁后调用

统计网站人数例子

//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {//创建session监听: 看你的一举一动//一旦创建Session就会触发一次这个事件!public void sessionCreated(HttpSessionEvent se) {ServletContext ctx = se.getSession().getServletContext();System.out.println(se.getSession().getId());Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");if (onlineCount==null){onlineCount = new Integer(1);}else {int count = onlineCount.intValue();onlineCount = new Integer(count+1);}ctx.setAttribute("OnlineCount",onlineCount);}//销毁session监听//一旦销毁Session就会触发一次这个事件!public void sessionDestroyed(HttpSessionEvent se) {ServletContext ctx = se.getSession().getServletContext();Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");if (onlineCount==null){onlineCount = new Integer(0);}else {int count = onlineCount.intValue();onlineCount = new Integer(count-1);}ctx.setAttribute("OnlineCount",onlineCount);}/*Session销毁:1. 手动销毁  getSession().invalidate();2. 自动销毁*/
}

相关文章:

JAVAweb之过滤器,监听器

文章目录 过滤器认识生命周期FilterConfigFilterChain过滤器执行顺序应用场景代码 监听器认识ServletContextListenerHttpSessionListenerServletRequestListener代码 过滤器 认识 Java web三大组件之一&#xff0c;与Servlet相似。过滤器是用来拦截请求的&#xff0c;而非处…...

计算机毕业设计SpringBoot+Vue.js足球青训俱乐部管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…...

QSplashScreen --软件启动前的交互

目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类&#xff0c;用于显示启动画面。它通常在应用程序启动时显示&#xff0c;以向用户显…...

「软件设计模式」责任链模式(Chain of Responsibility)

深入解析责任链模式&#xff1a;用C打造灵活的请求处理链 引言&#xff1a;当审批流程遇上设计模式 在软件系统中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个请求需要经过多个处理节点的判断&#xff0c;每个节点都有权决定是否处理或传递请求。就像企业的请假审批…...

蓝桥杯嵌入式客观题以及解释

第十一届省赛&#xff08;大学组&#xff09; 1.稳压二极管时利用PN节的反向击穿特性制作而成 2.STM32嵌套向量终端控制器NVIC具有可编程的优先等级 16 个 3.一个功能简单但是需要频繁调用的函数&#xff0c;比较适用内联函数 4.模拟/数字转换器的分辨率可以通过输出二进制…...

你对WebAssembly的看法是什么?

WebAssembly&#xff08;Wasm&#xff09;是一种新兴的技术&#xff0c;旨在通过提供一种新的低级字节码格式来提高 Web 应用程序的性能和效率。它与 JavaScript 互补&#xff0c;使得开发者可以将其他编程语言&#xff08;如 C、C、Rust 等&#xff09;编译为高效的字节码&…...

Qt在Linux嵌入式开发过程中复杂界面滑动时卡顿掉帧问题分析及解决方案

Qt在Linux嵌入式设备开发过程中&#xff0c;由于配置较低&#xff0c;加上没有GPU&#xff0c;我们有时候会遇到有些组件比较多的复杂界面&#xff0c;在滑动时会出现掉帧或卡顿的问题。要讲明白这个问题还得从CPU和GPU的分工说起。 一、硬件层面核心问题根源剖析 CPU&#x…...

vscode 版本

vscode官网 Visual Studio Code - Code Editing. Redefined 但是官网只提供最新 在之前的版本就要去github找了 https://github.com/microsoft/vscode/releases 获取旧版本vscode安装包的方法_vscode 老版本-CSDN博客...

low rank decomposition如何用于矩阵的分解

1. 什么是矩阵分解和低秩分解 矩阵分解是将一个矩阵表示为若干结构更简单或具有特定性质的矩阵的组合或乘积的过程。低秩分解&#xff08;Low Rank Decomposition&#xff09;是其中一种方法&#xff0c;旨在将原矩阵近似为两个或多个秩较低的矩阵的乘积&#xff0c;从而降低复…...

C# string转unicode字符

在 C# 中&#xff0c;将字符串转换为 Unicode 字符&#xff08;即每个字符的 Unicode 码点&#xff09;可以通过遍历字符串中的每个字符并获取其 Unicode 值来实现。Unicode 值是一个整数&#xff0c;表示字符在 Unicode 标准中的唯一编号。 以下是实现方法&#xff1a; 1. 获…...

51单片机-串口通信编程

串行口工作之前&#xff0c;应对其进行初始化&#xff0c;主要是设置产生波特率的定时器1、串行口控制盒中断控制。具体步骤如下&#xff1a; 确定T1的工作方式&#xff08;编程TMOD寄存器&#xff09;计算T1的初值&#xff0c;装载TH1\TL1启动T1&#xff08;编程TCON中的TR1位…...

Fisher信息矩阵与Hessian矩阵:区别与联系全解析

Fisher信息矩阵与Hessian矩阵&#xff1a;区别与联系全解析 在统计学和机器学习中&#xff0c;Fisher信息矩阵&#xff08;FIM&#xff09;和Hessian矩阵是两个经常出现的概念&#xff0c;它们都与“二阶信息”有关&#xff0c;常用来描述函数的曲率或参数的敏感性。你可能听说…...

有哪些开源大数据处理项目使用了大模型

以下是一些使用了大模型的开源大数据处理项目&#xff1a; 1. **RedPajama**&#xff1a;这是一个开源项目&#xff0c;使用了LLM大语言模型数据处理组件&#xff0c;对GitHub代码数据进行清洗和处理。具体流程包括数据清洗、过滤低质量样本、识别和删除重复样本等步骤。 2. …...

ubuntu离线安装Ollama并部署Llama3.1 70B INT4

文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件&#xff08;推荐、更容易&#xff09;4.2 加载.Safetensors文件&#xff08;不建议使用&#xff09; 5.配置大模型文件 参考&#xff1a; 1、 如…...

机器学习数学通关指南——泰勒公式

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 泰勒公式是用多…...

目标检测tricks

A. Stochastic Weight Averaging (SWA) 1. 基本思想 SWA 的核心思想是通过对训练过程中不同时间点的模型参数进行加权平均&#xff0c;从而获得一个更好的模型。具体来说&#xff0c;SWA 在训练过程的后期阶段对多个不同的模型快照&#xff08;snapshots&#xff09;进行平均…...

JNA基础使用,调用C++返回结构体

C端 test.h文件 #pragma oncestruct RespInfo {char* path;char* content;int statusCode; };extern "C" { DLL_EXPORT void readInfo(char* path, RespInfo* respInfo); }test.cpp文件 #include "test.h"void readInfo(char* path, RespInfo* respInfo…...

【算法】793. 高精度乘法

题目 793. 高精度乘法 思路 把b当作一个整体进行乘法&#xff0c;用A的每一位和b相乘&#xff0c;还要加上判断001的情况&#xff0c;把前面的0删掉。 代码 #include<iostream> #include<vector> using namespace std; vector<int>mul(vector<int>…...

解锁养生密码,拥抱健康生活

在快节奏的现代生活中&#xff0c;养生不再是一种选择&#xff0c;而是我们保持活力、提升生活质量的关键。它不是什么高深莫测的学问&#xff0c;而是一系列融入日常的简单习惯&#xff0c;每一个习惯都在为我们的健康加分。 早晨&#xff0c;当第一缕阳光洒进窗户&#xff0c…...

OpenCV(6):图像边缘检测

图像边缘检测是计算机视觉和图像处理中的一项基本任务&#xff0c;它用于识别图像中亮度变化明显的区域&#xff0c;这些区域通常对应于物体的边界。是 OpenCV 中常用的边缘检测函数及其说明: 函数算法说明适用场景cv2.Canny()Canny 边缘检测多阶段算法&#xff0c;检测效果较…...

spark的一些指令

一&#xff0c;复制和移动 1、复制文件 格式&#xff1a;cp 源文件 目标文件 示例&#xff1a;把file1.txt 复制一份得到file2.txt 。那么对应的命令就是&#xff1a;cp file1.txt file2.txt 2、复制目录 格式&#xff1a;cp -r 源文件 目标文件夹 示例&#xff1a;把目…...

OpenHarmony全球化子系统

OpenHarmony全球化子系统 简介系统架构目录相关仓 简介 当OpenHarmony系统/应用在全球不同区域使用时&#xff0c;系统/应用需要满足不同市场用户关于语言、文化习俗的需求。全球化子系统提供支持多语言、多文化的能力&#xff0c;包括&#xff1a; 资源管理能力 根据设备类…...

创建私人阿里云docker镜像仓库

步骤1、登录阿里云 阿里云创建私人镜像仓库地址&#xff1a;容器镜像服务 步骤2、创建个人实例 步骤&#xff1a;【实例列表】 》【创建个人实例】 》【设置Registry登录密码】 步骤3、创建命名空间 步骤&#xff1a;【个人实例】》【命名空间】》【创建命名空间】 注意&am…...

【LLM】本地部署LLM大语言模型+可视化交互聊天,附常见本地部署硬件要求(以Ollama+OpenWebUI部署DeepSeekR1为例)

【LLM】本地部署LLM大语言模型可视化交互聊天&#xff0c;附常见本地部署硬件要求&#xff08;以OllamaOpenWebUI部署DeepSeekR1为例&#xff09; 文章目录 1、本地部署LLM&#xff08;以Ollama为例&#xff09;2、本地LLM交互界面&#xff08;以OpenWebUI为例&#xff09;3、本…...

【考研】复试相关上机题目

文章目录 22机试回忆版1、判断燃气费描述输入格式输出格式输入样例输出样例 C o d e Code Code 2、统计闰年数量描述输入格式输出格式输入样例输出样例 C o d e Code Code 3、打印图形描述输入格式输出格式 C o d e Code Code 4、密文数据描述输入格式输出格式输入样例输出样例…...

vue3除了pinia/vuex的其他通讯方式还有那些

1. Props 和 Events Props&#xff1a;父组件通过 props 向子组件传递数据。 Events&#xff1a;子组件通过 $emit 向父组件发送事件。 <!-- ParentComponent.vue --> <template><ChildComponent :message"parentMessage" update-message"updat…...

【Python爬虫(80)】当Python爬虫邂逅边缘计算:探索数据采集新境界

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

LLM之论文阅读——Context Size对RAG的影响

前言 RAG 系统已经在多个行业中得到广泛应用&#xff0c;尤其是在企业内部文档查询等场景中。尽管 RAG 系统的应用日益广泛&#xff0c;关于其最佳配置的研究却相对缺乏&#xff0c;特别是在上下文大小、基础 LLM 选择以及检索方法等方面。 论文原文: On the Influence of Co…...

2025-02-25 学习记录--C/C++-用C语言实现删除字符串中的子串

用C语言实现删除字符串中的子串 在C语言中&#xff0c;你可以使用strstr函数来查找子串&#xff0c;然后用memmove或strcpy来覆盖或删除找到的子串。 一、举例 &#x1f430; #include <stdio.h> // 包含标准输入输出库&#xff0c;用于使用 printf 函数 #include <s…...