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

Java中的拦截器、过滤器及监听器

过滤器(Filter)监听器(Listener)拦截器(Interceptor)
关注点web请求系统级别参数、对象Action(部分web请求)
如何实现函数回调事件Java反射机制(动态代理)
应用场景设置字符编码统计网站在线人数拦截未登录用户
URL级别的权限访问控制清除过期session审计日志
过滤敏感词汇
压缩响应信息
是否依赖servlet容器依赖依赖不依赖
servlet提供的支持Filter接口ServletContextListerner抽象接口Action(部分web请求)
HttpSessionListener抽象接口HandlerinterceptorAdapter类
Spring提供的支持HandlerInterceptor接口
级别系统级系统级非系统级

Interceptor

在这里插入图片描述

拦截器是基于Java反射机制(动态代理)来实现的;可以控制请求的控制器和方法,但控制不了请求方法里的参数(用于处理页面提交的请求响应并进行处理,如国际化,主题更换,过滤等)。

一般说到拦截器都是基于Spring框架下,自定义拦截器可以实现HandlerInterceptor接口或继承抽象类HandlerInterceptorAdapter,并重写3个方法即可。

public interface HandlerInterceptor {// preHandle请求执行前执行default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}// postHandler请求结束后执行,需preHandle方法返回true才执行default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}// afterCompletion是视图渲染完成后才执行,需preHandle返回true,常用于清理资源等工作default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}

抽象类HandlerInterceptorAdapter实现AsyncHandlerInterceptor,而AsyncHandlerInterceptor继承HandlerInterceptor,并增加方法afterConcurrentHandlingStarted

public interface AsyncHandlerInterceptor extends HandlerInterceptor {//default void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}
}

注:HandlerInterceptorAdapter在Spring 5.3版本被标记为废弃。

无论是哪种方式,都需要添加配置使之生效:

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// DemoInterceptorregistry.addInterceptor(new DemoInterceptor()).addPathPatterns("/**");super.addInterceptors(registry);}
}

另外Spring框架提供很多继承HandlerInterceptorAdapter的常用拦截器类,如:

  1. UserRoleAuthorizationInterceptor,实现用户登录认证的拦截功能,如果当前用户没有通过认证,会报403错误
  2. LocaleChangeInterceptor
  3. ThemeChangeInterceptor:6.0版本被废弃
  4. ResourceUrlProviderExposingInterceptor
  5. ConversionServiceExposingInterceptor
  6. UriTemplateVariablesHandlerInterceptor

Filter

在这里插入图片描述

jakarta.servlet.Filter是Java原有接口:

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

FilterChain,把所有的过滤器都放在FilterChain里边,责任链模式。JavaDoc给出几种过滤器的作用:

  1. Authentication Filters,即用户访问权限过滤
  2. Logging and Auditing Filters,日志过滤,可以记录特殊用户的特殊请求的记录等
  3. Image conversion Filters
  4. Data compression Filters
  5. Encryption Filters
  6. Tokenizing Filters
  7. Filters that trigger resource access events
  8. XSL/T filters
  9. Mime-type chain Filter

Listener

在这里插入图片描述

EventListener空实现,标记接口。

/*** A tagging interface that all event listener interfaces must extend.* @since JDK1.1*/
public interface EventListener {
}

监听器就是一个实现特定接口的程序。用于监听一个Java对象的方法调用或者属性变化。常用的监听器接口有三类:

1.Application级

对Servlet上下文进行监听,用于监听ServletContext对象的创建和删除以及属性的添加、删除、修改等操作,有两个接口类:

  • ServletContextAttributeListener源码:
public interface ServletContextAttributeListener extends EventListener {// 当程序把一个属性存入application范围时触发该方法void attributeAdded(ServletContextAttributeEvent var1);// 当程序把一个属性从application范围删除时触发该方法void attributeRemoved(ServletContextAttributeEvent var1);// 当程序替换application范围内的属性时将触发该方法void attributeReplaced(ServletContextAttributeEvent var1);
}
  • ServletContextListener,当需要在处理任何客户端请求之前进行某个操作,并且希望在整个应用过程中该操作一直可用,此时ServletContextListener接口将会起到作用。其源码:
public interface ServletContextListener extends EventListener {// 创建ServletContext时,即Web应用程序初始化后激发该方法void contextInitialized(ServletContextEvent var1);// 销毁ServletContext时,即将结束销毁激发该方法void contextDestroyed(ServletContextEvent var1);
}

2.Session级

对HTTP会话进行监听,包括:session的创建和销毁,session中属性的增加、删除、修改,session的active和passivate情况等,接口主要有4个:

  • HttpSessionAttributeListener 该接口用于监听HttpSession(session)范围内属性的改变,源码:
public interface HttpSessionAttributeListener extends EventListener {// 当在session中添加对象时触发此操作void attributeAdded(HttpSessionBindingEvent var1);// 当在session中删除对象时触发此操作void attributeRemoved(HttpSessionBindingEvent var1);// 当在session中修改对象时触发此操作void attributeReplaced(HttpSessionBindingEvent var1);
}
  • HttpSessionListener 该接口用于监听session的创建和销毁过程,源码:
public interface HttpSessionListener extends EventListener {// 用户与服务器的会话开始、创建时时触发该方法void sessionCreated(HttpSessionEvent var1);// 用户与服务器的会话断开、销毁时触发该方法void sessionDestroyed(HttpSessionEvent var1);
}

一般情况下,HttpSessionActivationListener和HttpSessionBindingListener一起使用,这两个监听器比较特殊,实现这两个接口的类不需要在web.xml中进行注册,被钝化的JavaBean对象会被持久化到存储设备中,活化的JavaBean对象会被从存储设备中恢复,前提是该JavaBean对象实现Serializable接口。

  • HttpSessionActivationListener 监听Active、unactive的事件,源码:
public interface HttpSessionActivationListener extends EventListener {// 当绑定到HttpSession对象中的对象将要随HttpSession对象被钝化之前,web服务器调用该对象的此方法void sessionWillPassivate(HttpSessionEvent var1);// 当绑定到HttpSession对象中的对象将要随HttpSession对象被活化之后,web服务器调用该对象的此方法void sessionDidActivate(HttpSessionEvent var1);
}
  • HttpSessionBindingListener 监听被绑定到Session中和从Session中删除的事件:
public interface HttpSessionBindingListener extends EventListener {// 当对象被绑定到HttpSession对象中时,web服务器调用该对象的此方法,从而对象被设置到session中 void valueBound(HttpSessionBindingEvent var1);// 当对象从HttpSession对象中解除绑定时,web服务器调用该对象的此方法,从而对象从session中被移除void valueUnbound(HttpSessionBindingEvent var1);
}

3.request级

对客户端请求进行监听,监听用户的请求和request范围内属性的变化,接口主要有2个:

  • ServletRequestAttributeListener源码:
// 用于监听request范围内属性的变化
public interface ServletRequestAttributeListener extends EventListener {// 当程序向request范围内添加属性时触发该方法void attributeAdded(ServletRequestAttributeEvent var1);// 当程序在request范围内删除属性时触发该方法void attributeRemoved(ServletRequestAttributeEvent var1);// 当程序在request范围内的属性被替换或修改时触发该方法void attributeReplaced(ServletRequestAttributeEvent var1);
}
  • ServletRequestListener源码:
public interface ServletRequestListener extends EventListener {// 用户请求到达、被初始化时触发该方法void requestDestroyed(ServletRequestEvent var1);// 用户请求结束、被销毁时触发该方法void requestInitialized(ServletRequestEvent var1);
}

区别

拦截器和过滤器

功能比较类似,过滤器和拦截器都是AOP的具体实现。区别:

拦截器是基于Java反射(动态代理)机制,过滤器是基于函数回调;
拦截器不依赖与servlet容器,过滤器依赖于servlet容器;
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用;
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问;
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次;
拦截器可以获取IOC容器中的各个bean,而过滤器就不行,在拦截器里注入一个service,可以调用业务逻辑;
拦截器只能过滤请求,过滤器过滤范围较大;
使用的主要是函数回调,和框架无关,可以控制最初的http请求,但是更细一点的类和方法控制不了。
一个请求过来,先由过滤器处理,看程序是否受理该请求。过滤器放过后,程序中的拦截器进行处理, 处理完后进入被AOP动态代理重新编译过的主要业务类进行处理。
Filter,Interceptor,Aspect 实际上都是对Aop的具体实现。都是对业务逻辑的提取。都可以实现权限检查,日志记录。不同的是使用的范围不同,规范不同,深度不同。

过滤器和监听器

都是用于增强Web应用的功能和扩展性的重要组件,但它们的作用对象、触发时机、接口实现以及用途有一定的差异

作用对象:过滤器作用于Servlet、JSP或其他Web资源的请求和响应过程。它可以对请求进行预处理,也可以对响应进行后处理,例如修改请求、过滤请求、修改响应、过滤响应等。
监听器则是用于监听Web应用中的事件,如ServletContext、HttpSession、ServletRequest等对象的创建、销毁、属性变更等事件。
触发时机:过滤器在请求进入Servlet之前进行处理,也可以在响应返回给客户端之前进行处理,因此它可以用来实现诸如权限控制、字符编码转换、日志记录等功能。
监听器则是在特定事件发生时触发,例如 ServletContext 初始化、销毁,HttpSession 创建、销毁,ServletRequest 属性变更等。
接口实现:过滤器实现jakarta.servlet.Filter接口,重写doFilter()方法来处理请求和响应。
监听器实现jakarta.servlet.ServletContextListener、jakarta.servlet.http.HttpSessionListener、jakarta.servlet.ServletRequestListener等接口,根据需要监听相应的事件。
用途:过滤器常用于对请求和响应进行过滤处理,如设置字符编码、身份验证、日志记录等。
监听器常用于监听Web应用中的事件,如初始化操作、销毁操作、属性变更等,用于执行特定的逻辑。

相关文章:

Java中的拦截器、过滤器及监听器

过滤器(Filter)监听器(Listener)拦截器(Interceptor)关注点web请求系统级别参数、对象Action(部分web请求)如何实现函数回调事件Java反射机制(动态代理)应用场…...

Nginx 和 Lua 设计黑白名单

使用 Nginx 和 Lua 设计黑白名单机制,借助 Redis 存储 在现代网络应用中,安全性是一个不可忽视的关键因素。应用程序需要能够有效地管理访问权限,以保护其资源不被恶意用户攻击。黑白名单机制是实现访问控制的一种有效方式。本文将详细介绍如…...

【部署篇】Redis-01介绍‌

一、Redis介绍‌ 1、什么是Redis? ‌Redis,英文全称是Remote Dictionary Server(远程字典服务),Redis是一个开源的、使用‌ANSI C语言编写的‌Key-Value存储系统,支持网络、可基于内存亦可持久化。‌ 它提…...

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…...

【text2sql】ReFSQL检索生成框架

论文标题为《ReFSQL: A Retrieval-Augmentation Framework for Text-to-SQL Generation》,发表在 EMNLP 2023 上。ReFSQL框架通过结构增强检索器来获取与当前问题语义和模式结构相似的样本,然后通过对比学习机制来引导模型学习到这些样本的特定知识&…...

美国市场跨平台应用程序本地化流程的特点

为美国市场本地化移动应用程序是为了创造一种自然、直观、与多元化和精通技术的受众文化相关的体验。美国是世界上最大、最具竞争力的应用程序市场之一,用户期望高质量的性能以及在个人层面引起共鸣的内容。这个市场的本地化需要对美国语言、文化和行为有细致入微的…...

STM32 实现 TCP 服务器与多个设备通信

目录 一、引言 二、硬件准备 三、软件准备 四、LWIP 协议栈的配置与初始化 五、创建 TCP 服务器 1.创建 TCP 控制块 2.绑定端口 3. 进入监听状态 4.设置接收回调函数 六、处理多个客户端连接 七、数据处理与通信管理 八、错误处理与资源管理 九、总结 一、引…...

EdgeNAT: 高效边缘检测的 Transformer

EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b):来自BSDS500的数据集的输入图像。(c, d):对应的真实标签。(e, f):由EdgeNAT检测到的边缘。(e)显示了由于颜色变化…...

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】,3.4k stars - WiFi 网络分析工具二、【penpot】,33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】,6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…...

力扣21~30题

21题(简单): 分析: 按要求照做就好了,这种链表基本操作适合用c写,python用起来真的很奇怪 python代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, v…...

AGI|如何构建一个RAG应用?入门新手攻略!

目录 一、概述 二、过程概述 三、如何优化提问? 四、路由和高级查询 五、丰富索引结构 六、重排序上下文 七、总结 一、概述 Retrieval Augmented Generation RAG 检索增强的内容生成。 从字面上来看检索只是一种手段途径,在人工智能领域中存在多种…...

【.NET 8 实战--孢子记账--从单体到微服务】--角色(增加/删除/修改/查询)

本节我们将开始编写角色相关的接口 一、需求 本节的要做的需求如下: 编号需求标题需求内容1增加角色角色名称不能重复2删除角色角色逻辑删除3修改角色修改的名称不能和已有名称重复4查询角色不分页查询,根据角色名模糊匹配 二、Role类和Role表 这一…...

数据结构-栈与队列笔记

普通的双端队列 用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; import java.util.ArrayDeque; import java.util.Deque;class MyQueue {// 使用双端队列&#xff08;Deque&#xff09;来实现一个队列Deque<Integer> input; // 用于存放新加…...

DevExpress WPF中文教程:如何解决数据更新的常见问题?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

SpringBoot基础(四):bean的多种加载方式

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 SpringBoot基础(四)&#xff1a;bean的多种加载方式 目录 一、xml配置文件二、注解定义bean1、使用AnnotationCon…...

JavaScript网页设计案例:构建动态交互的在线图书管理系统

JavaScript网页设计案例&#xff1a;构建动态交互的在线图书管理系统 在当今的数字化时代&#xff0c;网页设计不仅仅是关于美观和布局&#xff0c;更重要的是用户体验和互动性。JavaScript&#xff0c;作为一种强大的编程语言&#xff0c;在网页开发中扮演着至关重要的角色&a…...

嵌入式数据结构中线性表的具体实现

大家好,今天主要给大家分享一下,如何使用数据结构中的线性表以及具体的实现。 第一:线性表的定义和表示方法 线性表的定义 – 线性表就是零个或多个相同数据元素的有限序列。 • 线性表的表示方法 – 线性表记为: L=(a0,∙∙∙∙∙∙∙∙ai-1aiai+1 ∙∙∙∙∙∙an-1) •…...

Redis高级篇 —— 分布式缓存

Redis高级篇 —— 分布式缓存 文章目录 Redis高级篇 —— 分布式缓存1 Redis持久化1.1 RDB1.2 RDB的fork原理1.3 RDB总结1.4 AOF持久化1.5 RDB和AOF的对比 2 Redis主从2.1 搭建主从架构2.2 数据同步原理2.2.1 全量同步2.2.2 增量同步 3 Redis哨兵3.1 哨兵的作用和原理3.1.1 哨兵…...

彩族相机内存卡恢复多种攻略:告别数据丢失

在数字时代&#xff0c;相机内存卡作为我们存储珍贵照片和视频的重要媒介&#xff0c;其数据安全性显得尤为重要。然而&#xff0c;意外删除、错误格式化、存储卡损坏等情况时有发生&#xff0c;导致数据丢失&#xff0c;给用户带来不小的困扰。本文将详细介绍彩族相机内存卡数…...

【C语言】计算需要的缓冲区大小

使用 snprintf 函数计算缓冲区大小的方法其实是一个常见的技巧,因为 snprintf 会返回所需的缓冲区大小,而不需要实际写入任何数据。当传入 NULL 指针时,`snprintf` 并不会尝试写入数据,而是仅仅返回格式化后的字符串长度。如果再加上终止符(即 \0),我们就可以知道实际需…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...