Filter与Listener(过滤器与监听器)

1.Filter

1.过滤器概述

过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener

它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作

在程序中访问服务器资源时,当一个请求到来,服务器首先判断是否有过滤器与请求资源相关联,如果有,过滤器可以将请求拦截下来,完成一些特定的功能,再由过滤器决定是否交给请求资源。如果没有则像之前那样直接请求资源了。响应也是类似的

过滤器一般用于完成通用的操作,例如:登录验证、统一编码处理、敏感字符过滤等

2.Filter概述

Filter 是一个接口,如果想实现过滤器的功能,必须实现该接口

核心方法

返回值方法名作用
voidinit(FilterConfig config)初始化方法
voiddoFilter(ServletRequest req,ServletResponse resp,FilterChain chain)对请求资源和响应资源过滤
voiddestory()销毁方法

 配置方式

        注解方式

        配置文件 

3.FilterChain

 FilterChain 是一个接口,代表过滤器链对象。由 Servlet 容器提供实现类对象,直接使用即可。

 过滤器可以定义多个,就会组成过滤

核心方法

返回值方法名作用
voiddoFilter(ServletRequest req,ServletResponse resp)放行方法

如果有多个过滤器,在第一个过滤器中调用下个过滤器,依次类推。直到到达最终访问资源

如果只有一个过滤器,放行时,就会直接到达最终访问资源

  

4.过滤器的使用 

需求说明

通过Filter过滤器解决多个资源写出中文乱码的问题

实现步骤

1.创建一个web项目

2.创建两个Servlet功能类,都向客户端写出中文数据

3.创建一个Filter过滤器实现类,重写doFilter核心方法

4.在方法内部解决中文乱码,并放行

5.部署并启动项目

6.通过浏览器测试

package filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/*过滤器基本使用
*/
@WebFilter("/*")
public class FilterDemo01 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo01执行了...");//处理乱码servletResponse.setContentType("text/html;charset=UTF-8");//放行filterChain.doFilter(servletRequest,servletResponse);}
}

5.过滤器的使用细节

配置方式

         注解方式 @WebFilter(拦截路径)

         配置文件

<filter><filter-name>filterDemo01</filter-name><filter-class>filter.FilterDemo01</filter-class>
</filter>
<filter-mapping><filter-name>filterDemo01</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

 多个过滤器使用顺序

如果有多个过滤器,取决于过滤器映射的顺序

也就是filter-mapping配置的先后顺序

6.过滤器的生命周期

 创建(出生)

当应用加载时实例化对象并执行 init 初始化方法

 服务(活着)

对象提供服务的过程,执行 doFilter 方法
​​​​​

只要应用一直提供服务,对象就一直存在

 销毁(死亡)

当应用卸载时或服务器停止时对象销毁。执行 destroy

Filter的实例对象在内存中也只有一份。所以也是单例的

package filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class FilterDemo03 implements Filter {//初始化方法@Overridepublic void init(FilterConfig filterConfig) {System.out.println("对象初始化成功了...");}//提供服务方法@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo03执行了...");//处理乱码servletResponse.setContentType("text/html;charset=UTF-8");//放行filterChain.doFilter(servletRequest,servletResponse);}//对象销毁@Overridepublic void destroy() {System.out.println("对象销毁了...");}
}

 web.xml

<filter><filter-name>filterDemo03</filter-name><filter-class>filter.FilterDemo03</filter-class></filter><filter-mapping><filter-name>filterDemo03</filter-name><url-pattern>/*</url-pattern></filter-mapping>

7.FilterConfig过滤器配置对象

FilterConfig 是一个接口。代表过滤器的配置对象,可以加载一些初始化参数。与ServletConfig类似

核心方法

返回值方法名作用
StringgetFilterName()获取过滤器对象名称
StringgetInitParameter(String key)根据key过去value
EnumerationgetInitParameterNames()获所有参数的key
ServletContextgetServletContext()获取应用上下文对象
package filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class FilterDemo04 implements Filter {//初始化方法@Overridepublic void init(FilterConfig filterConfig) {System.out.println("对象初始化成功了...");//获取过滤器名称String filterName = filterConfig.getFilterName();System.out.println(filterName);//根据name获取valueString username = filterConfig.getInitParameter("username");System.out.println(username);}//提供服务方法@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo04执行了...");//处理乱码servletResponse.setContentType("text/html;charset=UTF-8");//放行filterChain.doFilter(servletRequest,servletResponse);}//对象销毁@Overridepublic void destroy() {System.out.println("对象销毁了...");}
}

web.xml

 <filter><filter-name>filterDemo04</filter-name><filter-class>filter.FilterDemo04</filter-class><init-param><param-name>username</param-name><param-value>zhangsan</param-value></init-param></filter><filter-mapping><filter-name>filterDemo04</filter-name><url-pattern>/*</url-pattern></filter-mapping>

8.过滤器五种拦截行为 

Filter 过滤器默认拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,就需要我们配置

<filter><filter-name>filterDemo05</filter-name><filter-class>Filter.FilterDemo5</filter-class><!--配置开启异步支持,当dispatcher配置ASYNC时,需要配置此行--><async-supported>true</async-supported>
</filter>
<filter-mapping><filter-name>filterDemo05</filter-name><url-pattern>/index.jsp</url-pattern><!--过滤请求:默认值。--><dispatcher>REQUEST</dispatcher><!--过滤全局错误页面:当由服务器调用全局错误页面时,过滤器工作--><dispatcher>ERROR</dispatcher><!--过滤请求转发:当请求转发时,过滤器工作。--><dispatcher>FORWARD</dispatcher><!--过滤请求包含:当请求包含时,过滤器工作。它只能过滤动态包含,jsp的include指令是静态包含,过滤器不会起作用--><dispatcher>INCLUDE</dispatcher><!--过滤异步类型,它要求我们在filter标签中配置开启异步支持--><dispatcher>ASYNC</dispatcher>
</filter-mapping>

2.Listener 

1.监听器概述

观察者设计模式,所有的监听器都是基于观察者设计模式的

三个组成部分

事件源:触发事件的对象。

事件:触发的动作,里面封装了事件源。

监听器:当事件源触发事件时,要做的事情。一般是一个接口,由使用者来实现。

监听器:

在程序当中,我们可以对:对象的创建销毁、域对象中属性的变化、会话相关内容进行监听

Servlet 规范中共计 8 个监听器,监听器都是以接口形式提供,具体功能需要我们自己来完成

2.监听对象的监听器

1.ServletContextListener:用于监听 ServletContext 对象的创建和销毁

核心方法

返回值方法名作用
voidcontextInitialized(ServletContextEvent sce)对象创建时执行该方法
voidcontextDestroyed(ServletContextEvent sce)对象销毁时执行该方法

参数:ServletContextEvent 代表事件对象

事件对象中封装了事件源,也就是 ServletContext

真正的事件指的是创建或销毁 ServletContext 对象的操作

2.HttpSessionListener:用于监听 HttpSession 对象的创建和销毁

核心方法

返回值方法名作用
voidsessionCreated(HttpSessionEvent se)对象创建时执行该方法
voidsessionDestroyed(HttpSessionEvent se)对象销毁时执行该方法

参数:HttpSessionEvent 代表事件对象

事件对象中封装了事件源,也就是 HttpSession

真正的事件指的是创建或销毁 HttpSession 对象的操作

3.ServletRequestListener:用于监听 ServletRequest 对象的创建和销毁

核心方法

返回值方法名作用
voidrequestInitialized(ServletRequestEvent sre)对象创建时执行该方法
voidrequestDestroyed(ServletRequestEvent sre)对象销毁时执行该方法

参数:ServletRequestEvent 代表事件对象

事件对象中封装了事件源,也就是 ServletRequest

真正的事件指的是创建或销毁 ServletRequest 对象的操作

3.监听域对象属性变化的监听器

1.ServletContextAttributeListener:用于监听 ServletContext 应用域中属性的变化

核心方法

返回值方法名作用
voidattributeAdded(ServletContextAttributeEvent scae)域中添加属性时执行该方法
voidattributeRemoved(ServletContextAttributeEvent scae)域中移除属性时执行该方法
voidattributeReplaced(ServletContextAttributeEvent scae)域中替换属性时执行该方法

参数:ServletContextAttributeEvent 代表事件对象

事件对象中封装了事件源,也就是 ServletContext

真正的事件指的是添加、移除、替换应用域中属性的操作

2.HttpSessionAttributeListener:用于监听 HttpSession 会话域中属性的变化

核心方法

返回值方法名作用
voidattributeAdded(ServletSessionBindingEvent se)域中添加属性时执行该方法
voidattributeRemoved(ServletSessionBindingEvent se)域中移除属性时执行该方法
voidattributeReplaced(ServletSessionBindingEvent se)域中替换属性时执行该方法

参数:HttpSessionBindingEvent 代表事件对象

事件对象中封装了事件源,也就是 HttpSession

真正的事件指的是添加、移除、替换会话域中属性的操作

3.ServletRequestAttributeListener:用于监听 ServletRequest 请求域中属性的变化

核心方法

返回值方法名作用
voidattributeAdded(ServletRequestAttributeEvent srae)域中添加属性时执行该方法
voidattributeRemoved(ServletRequestAttributeEvent srae)域中移除属性时执行该方法
voidattributeReplaced(ServletRequestAttributeEvent srae)域中替换属性时执行该方法

参数:ServletRequestAttributeEvent 代表事件对象

事件对象中封装了事件源,也就是 ServletRequest

真正的事件指的是添加、移除、替换请求域中属性的操作

4.监听会话相关的感知性监听器

1.HttpSessionBindingListener:用于感知对象和会话域绑定的监听器

核心方法

返回值方法名作用
voidvalueBound(HttpSessionBindingEvent event)数据添加到会话域中(绑定时)执行该方法
voidvalueUnbound(HttpSessionBindingEvent event)数据从会话域中移除(解绑时)执行该方法

参数:HttpSessionBindingEvent 代表事件对象

事件对象中封装了事件源,也就是 HttpSession

真正的事件指的是添加、移除会话域中数据的操作

2.HttpSessionActivationListener:用于感知会话域中对象钝化和活化的监听器

核心方法

返回值方法名作用
voidsessionWillPassivate(HttpSessionEvent se)会话域中数据钝化时执行该方法
voidsessionDidActivate(HttpSessionEvent se)会话域中数据活化时执行该方法

参数:HttpSessionEvent 代表事件对象

事件对象中封装了事件源,也就是 HttpSession

真正的事件指的是会话域中数据钝化、活化的操作

5.监听器的使用

在实际开发中,我们可以根据具体情况来从这8个监听器中选择使用

感知型监听器由于无需配置,只需要根据实际需求编写代码

ServletContextListener

package listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;/*ServletContext对象的创建和销毁的监听器//配置监听器:@WebListener*/
@WebListener
public class ServletContextListenerDemo implements ServletContextListener {/*ServletContext对象创建的时候执行此方法*/@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("监听到了对象的创建...");//获取对象ServletContext servletContext = sce.getServletContext();System.out.println(servletContext);}/*ServletContext对象销毁的时候执行此方法*/@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("监听到了对象的销毁...");}
}

ServletContextAttributeListener

package listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;/*应用域对象中的属性变化的监听器*/
@WebListener
public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener {/*向应用域对象中添加属性时执行此方法*/@Overridepublic void attributeAdded(ServletContextAttributeEvent scae) {System.out.println("监听到了属性的添加...");//获取应用域对象ServletContext servletContext = scae.getServletContext();//获取属性Object value = servletContext.getAttribute("username");System.out.println(value);}/*向应用域对象中替换属性时执行此方法*/@Overridepublic void attributeReplaced(ServletContextAttributeEvent scae) {System.out.println("监听到了属性的替换...");//获取应用域对象ServletContext servletContext = scae.getServletContext();//获取属性Object value = servletContext.getAttribute("username");System.out.println(value);}/*向应用域对象中移除属性时执行此方法*/@Overridepublic void attributeRemoved(ServletContextAttributeEvent scae) {System.out.println("监听到了属性的移除...");//获取应用域对象ServletContext servletContext = scae.getServletContext();//获取属性Object value = servletContext.getAttribute("username");System.out.println(value);}
}

修改ServletContextListenerDemo:在contextInitialized中增加

//添加属性
servletContext.setAttribute("username","zhangsan");//替换属性
servletContext.setAttribute("username","lisi");//移除属性
servletContext.removeAttribute("username");

 

用配置文件方式(第一种为注解方式)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置监听器--><listener><listener-class>listener.ServletContextListenerDemo</listener-class></listener><listener><listener-class>listener.ServletContextAttributeListenerDemo</listener-class></listener>
</web-app>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166176.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口测试vs功能测试

接口测试和功能测试的区别&#xff1a; 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什…

【diffusion model】扩散模型入门

写在最前&#xff0c;参加DataWhale 10月组队学习。 参考资料&#xff1a; HuggingFace 开源diffusion-models-class 1.扩散模型介绍 2.调用模型生成一张赛博风格的猫咪图片 2.1 安装依赖包 %pip install -qq -U diffusers datasets transformers accelerate ftfy pyarrow9…

软件报错msvcr120.dll丢失怎么办?五个有效修复方法分享

msvcr120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2012 Redistributable Package的一部分。如果你的电脑在运行一些需要这个文件的程序时出现了“msvcr120.dll丢失”的错误&#xff0c;那么就意味着你的电脑缺少了这个文件&#xff0c;或者这个文件已经损坏…

Jmeter —— 接口之间关联调用(获取上一个接口的返回值作为下一个接口的请求参数)

正则表达式&#xff1a; 具体如何操作&#xff1a; 1. 草稿保存&#xff0c; 此请求的响应数据的id 为发布总结的请求参数draft_id 2. 草稿保存的响应数据 3.在草稿保存的请求中&#xff0c;添加后置处理器- 正则表达式提取器&#xff0c; 提取响应数据的id信息 4. 发布总结请…

[架构之路-239]:目标系统 - 纵向分层 - 中间件middleware

目录 前言&#xff1a; 一、中间件概述 1.1 中间件在软件层次中的位置 1.2 什么是中间件 1.3 为什么需要中间件 1.4 中间件应用场合&#xff08;应用程序不用的底层需求&#xff1a;计算、存储、通信&#xff09; 1.5 中间件分类 - 按内容分 二、嵌入式系统的中间件 2…

TCP/IP(二十二)TCP 实战抓包分析(六)TCP 快速建立连接

一 TCP Fast Open 快速建立连接 说明&#xff1a; 之前讲解TCP 相关知识点遗漏了这个知识点,补充上 ① TFO简介 ② 请求 Fast Open Cookie过程 "原理图" ③ 真正开始 TCP Fast Open 重点&#xff1a; TFO 使 SYN包 可以包含payload 数据 ④ 抓包分析 1、…

怎样才能去除视频中的背景音乐,保留人声?

做视频剪辑&#xff0c;二次创作的朋友&#xff0c;需要去除视频中的背景音乐&#xff0c;保留人声&#xff1b;或者去除人声&#xff0c;保留背景音乐。如果请身边做视频的朋友帮忙&#xff0c;可有时不能沟通到位&#xff0c;完成后的效果并不是很理想&#xff0c;就很尴尬了…

python requests爬取税务总局税案通报、税务新闻和政策解读

文章目录 环境配置页面爬取流程税案通报爬取code税务新闻爬取政策解读爬取 环境配置 python&#xff1a;3.7 requests&#xff1a;发出请求&#xff0c;返回页面 beautifulsoup&#xff1a;解析页面 time&#xff1a;及时 warnings&#xff1a;忽视警告 页面 网址&#xff1…

聊聊设计模式--简单工厂模式

简单工厂模式 ​ 前面也学了很多各种微服务架构的组件&#xff0c;包括后续的服务部署、代码管理、Docker等技术&#xff0c;那么作为后端人员&#xff0c;最重要的任务还是代码编写能力&#xff0c;如何让你的代码写的漂亮、易扩展&#xff0c;让别人一看赏心悦目&#xff0c…

城市正视图(Urban Elevations, ACM/ICPC World Finals 1992, UVa221)rust解法

如图5-4所示&#xff0c;有n&#xff08;n≤100&#xff09;个建筑物。左侧是俯视图&#xff08;左上角为建筑物编号&#xff0c;右下角为高度&#xff09;&#xff0c;右侧是从南向北看的正视图。 输入每个建筑物左下角坐标&#xff08;即x、y坐标的最小值&#xff09;、宽度…

使用Spire.PDF for Python插件从PDF文件提取文字和图片信息

目录 一、Spire.PDF插件的安装 二、从PDF文件提取文字信息 三、从PDF文件提取图片信息 四、提取图片和文字信息的进阶应用 总结 在Python中&#xff0c;提取PDF文件的文字和图片信息是一种常见的需求。为了满足这个需求&#xff0c;许多开发者会选择使用Spire.PDF插件&…

C++特性——inline内联函数

1. 内联函数 1.1 C语言的宏 在C语言中&#xff0c;我们学习了用#define定义的宏函数&#xff0c;例如&#xff1a; #define Add(x, y) ((x) (y)) //两数相加相较于函数&#xff0c;我们知道宏替换具有如下比较明显的优点&#xff1a; 性能优势&#xff1a; 宏在预处理阶段…

将本地的项目上传到Gitee

目录 1.先在Gitee新建一个仓库,提交即可 2.进入到要上传的项目里面&#xff0c;右键选择 Git Bash Here 3.右键后就打开了Git命令窗口 4.配置你的用户名和邮箱(已经配置过则可跳过) 5.查看你的用户名和邮箱配置&#xff08;可不查看&#xff09; 6.输入git init指令&#…

【java】【重构一】分模块开发设计实战

目录 一、创建项目 1、先创建一个空项目 2、设置项目SDK等 二、创建父模块 选择springboot 1、创建父模块parent 2、删除多余文件&#xff0c;只保留pom.xml 3、修改pom.xml 4、将部分公共依赖加入到pom 三、创建实体类子模块entity 1、创建实体类子模块entity 2、…

关注用户信息卡片

效果展示 CSS 知识点 box-shadow 属性回顾CSS 变量回顾 实现页面整体布局 <div class"card"><div class"box"><!-- 视频 --><div class"vide_box"><video src"user.mp4" type"video/mp4" aut…

gulp打包vue3+jsx+less插件

最终转换结果如下 在根目录下添加gulpfile.js文件&#xff0c;package.json添加命令npm run gulp var gulp require(gulp) var babel require(gulp-babel) var less require(gulp-less) var del require(del); var spawn require(child_process).spawn;const outDir &…

Mysql数据库 1. SQL基础语法和操作

一、Mysql逻辑结构 一个数据库软件可以包含许多数据库 一个数据库包含许多表 一个表中包含许多字段&#xff08;列&#xff09; 数据库软件——>数据库——>数据表——>字段&#xff08;列&#xff09;、元组&#xff08;行&#xff09; 二、SQL语言基础语法 1.SQL…

机器学习(24)---AdaBoost(课堂笔记)

文章目录 一、知识记录二、题目2.1 题目12.2 题目22.3 答案书写 一、知识记录 二、题目 2.1 题目1 2.2 题目2 2.3 答案书写

2022年亚太杯APMCM数学建模大赛D题储能系统中传热翅片的结构优化求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 D题 储能系统中传热翅片的结构优化 原题再现 高效储能技术是解决可再生能源和余热资源波动性和间歇性的核心技术。相变蓄热以其较高的储能密度和近恒温蓄热放热而得到广泛应用。固-液相变材料具有相变前后相变潜热高、体积变化小等特点&#x…

智慧公厕蜕变多功能城市智慧驿站公厕的创新

随着城市发展的不断推进&#xff0c;对公共设施的便利性和智能化要求也日益提高。为满足市民对高品质、便捷、舒适的公共厕所的需求&#xff0c;智慧公厕行业的领航厂家广州中期科技有限公司&#xff0c;全新推出了一体化智慧公厕驿站。凭借着“高科技碳中和物联网创意设计新经…