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

news2024/10/11 5:44:50
过滤器(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 {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// DemoInterceptor
        registry.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应用中的事件,如初始化操作、销毁操作、属性变更等,用于执行特定的逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《大道平渊》· 廿贰 —— 杀心篇:独立人格的形成

《大道平渊》 独立人格的形成,在杀心的过程中会越来越完备。 在这个漫长的过程中,你会一次次击碎自己固有的三观,慢慢再修复你的三观。 . 不要认为一个人的明白,都是恍然大悟,都是碰到了高人指点。 并不是这样的&a…

使用 Raspberry Pi Pico W 的基于 MQTT 的分布式网络自适应估计

英文论文标题:MQTT based Adaptive Estimation over Distributed Network using Raspberry Pi Pico W 中文论文标题:使用 Raspberry Pi Pico W 的基于 MQTT 的分布式网络自适应估计 作者信息: Prantaneel DebnathAnshul GusainParth Sharm…

46 C 语言文件的打开与关闭、写入与读取函数:fopen、fclose、fputc、fputs、fprintf、fgetc、fgets、fscanf

目录 1 文件的存储形式 2 打开文件——fopen() 函数 2.1 功能描述 2.2 函数原型 2.3 文件打开方式(模式) 3 关闭文件——fclose() 函数 3.1 功能描述 3.2 函数原型 4 常见的文件写入方式 4.1 fputc() 函数 4.1.1 功能描述 4.1.2 函数原型 4…

第四范式发布全新一代文档数字化管理平台Smart Archive 2.0

产品上新 Product Release 今日,第四范式正式推出全新一代文档数字化管理平台——Smart Archive 2.0。该产品基于第四范式自研的文档处理大模型,实现零样本下对企业文档的精准识别及信息提取。文档处理大模型利用二十多个行业,上百种场景下的…

【华为】默认路由配置

1.配置接入层: LSW1(LSW3同理): vlan batch 10 20 in g0/0/1 port link-type ac port default vlan 10 in g0/0/2 port link-type ac port default vlan 20 in g0/0/24 port link-type tr port tr allow-pass vlan 10 20 2.配置汇聚层&#x…

Spring Boot 集成 LiteFlow 实现业务流程编排

LiteFlow 是一款轻量级的流程编排框架,它允许开发者通过简单的配置方式,将复杂的业务流程分解为多个独立的节点,然后通过定义规则来编排节点,达到解耦业务逻辑、提高代码可维护性的目的 1. LiteFlow 的基本概念 在 LiteFlow 中,主要有以下几个概念: 节点 (Node):代表一…

2015年国赛高教杯数学建模C题月上柳梢头解题全过程文档及程序

2015年国赛高教杯数学建模 C题 月上柳梢头 月上柳梢头,人约黄昏后”是北宋学者欧阳修的名句,写的是与佳人相约的情景。请用天文学的观点赏析该名句,并进行如下的讨论:   1. 定义“月上柳梢头”时月亮在空中的角度和什么时间称为…

SKG未来健康校招社招入职测评:综合能力及性格问卷SHL测评题库

SKG未来健康科技股份有限公司在校招和社招过程中使用的SHL测评题库主要考察应聘者的综合能力和性格特征。以下是对这些测评的简要分析: 综合能力测评: 测评时间:46分钟(实际答题时间36分钟) 题目数量:30题…

多jdk版本环境下,jenkins系统设置需指定JAVA_HOME环境变量

一、背景 由于不同项目对jdk版本的要求不同,有些是要求jdk11,有些只需要jdk8即可。 而linux机器上安装jdk的方式又多种多样,最后导致jenkins打包到底使用的是哪个jdk,比较混乱。 1、java在哪 > whereis java java: /usr/bin/…

不到千元的自动猫砂盆是智商税吗?这四大选购技巧不看就亏大了

虽然现在的人都说,猫砂盆等上班一天回来再清理也没有任何关系,但实际上在这一天里,猫咪的粪便已经在猫砂盆里滋生了很多无法察觉的细菌,久而久之就会影响猫咪的健康,导致尿闭,放了一天的便便臭味也让人无法…

数据结构与算法——Java实现 32.堆

人的想法和感受是会随着时间的认知改变而改变, 原来你笃定不会变的事,也会在最后一刻变得释然 —— 24.10.10 堆 堆是基于二叉树实现的数据结构 大顶堆每个分支的上一个节点的权值要大于它的孩子节点 小顶堆每个分支的上一个节点的权值要小于它的孩子…

PyQt5写好的py文件生成可执行的exe文件【Pyinstaller】

文章目录 pyinstaller介绍特点 1.单个py文件2.多个py文件3.程序图标设置4.打包形式(1)单个exe文件(2)文件夹 5.程序开始前的加载中图片6.UPX打包压缩问题解决办法 7.指令总结 pyinstaller介绍 pyinstaller 属于Python第三方库,可以将py文件在不同平台上打包为exe可执…

鸿蒙NEXT开发-沉浸式导航和键盘避让模式(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

架构与思维:漫谈高并发业务的CAS及ABA

1 高并发场景下的难题 1.1 典型支付场景 这是最经典的场景。支付过程,要先查询买家的账户余额,然后计算商品价格,最后对买家进行进行扣款,像这类的分布式操作,如果是并发量低的情况下完全没有问题的,但如果…

企业级私有化即时通讯软件:高效沟通与安全保障的优选

在当今这个信息化高速发展的时代,企业面临着前所未有的沟通挑战与信息安全压力。为了应对这些挑战,企业级私有化即时通讯软件应运而生,它不仅优化了内部沟通流程,还确保了数据的安全性与管理的深度需求得到满足。以下将从“助力大…

k8s部署jenkins集群,配置集群kubernetes plugin的pod模板

一、配置集群 填写k8s地址:https://kubernetes.default.svc.cluster.local 命名空间:kubernetes-plugin Jenkins地址:http://jenkins:18080 Jenkins通道:jenkins:50000 jenkins是容器别名 设置jenkinsslave的标签属性 二、…

2024年CSS @规则(At-rules)新增数量超过过去十年的总和,CSS @规则(At-rules)详解系列目录

2024年CSS 规则(At-rules)新增数量超过过去十年的总和, CSS 规则(At-rules)详解系列目录 本文目录: 零、时光宝盒 一、CSS 规则(At-rules)发展状况 二、什么是CSS 规则(At-rules) 2.1、一些背景 2.2、概念 2.3、CSS规则(At-rules) 规则(At-rules…

快速解决urllib3.exceptions.MaxRetryError: HTTPSConnectionPool

正题 使用pip命令查看urllib3版本 pip list发现版本为 1.26.9 urllib3 v1.26.9此时如下报错,无法正常使用(使用了代理) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(hostxxx.xxxxx.com, port443): Max retries exceeded wit…

充电宝租赁管理系统网站毕业设计SpringBootSSM框架开发

目录 1. 概述 2. 技术选择与介绍 3. 系统设计 4. 功能实现 5. 需求分析 1. 概述 充电宝租赁管理系统网站是一个既实用又具有挑战性的项目。 随着移动设备的普及和人们日常生活对电力的持续依赖,充电宝租赁服务已成为现代都市生活中的一项重要便利设施。它不仅为…

多线程(二):Thread类常见的属性和方法

目录 1、run & start 2、Thread类常见的属性和方法 2.1 构造方法 2.2 属性 3、后台进程 & 前台进程 4、setDaemon 5、isAlive 6、终止一个线程 6.1 变量捕获 6.2 currentThread & isInterrupted & interrupt 1、run & start 在多线程&#xff08…