过滤器、拦截器、aop -> ‘三兄弟‘

news2024/11/19 7:34:49

目录

 

一、熟悉

 三兄弟的区别

过滤器和拦截器的区别

 使用场景

二、使用

filter

Interceptor

aop


一、熟悉

三个词都很熟悉,在某些课程或者博客中总被提到,但平时基本不怎么写;

三者在家族中的关系可以看下下边这张图,可以很直观的看到,如果一个请求过来的时候
        1、先会经过filter链,之后才会到达servlet中;

        2、然后才会到达interceptor拦截器;

        3、通过拦截器后,会被指定的aop拦截到;

        4、最后才会到达服务层;

 三兄弟的区别

        1、过滤器,拦截器拦截的是URL。AOP拦截的是类的元数据(包、类、方法名、参数等)。

        2、过滤器并没有定义业务用于执行逻辑前、后等,仅仅是请求到达就执行。

        3、拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。

        4、AOP针对具体的代码,能够实现更加复杂的业务逻辑。

        三者功能类似,但各有优势,从过滤器–》拦截器–》切面,拦截规则越来越细致。 执行顺序依次是过滤器、拦截器、切面。

过滤器和拦截器的区别

        1、最简单明了的区别就是过滤器可以修改request,而拦截器不能

        2、过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境

        3、拦截器可以调用IOC容器中的各种依赖,而过滤器不能(不绝对)

        4、过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

        5、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

        6、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

        7、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射

        8、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。

        9、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。

        10、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

 使用场景

        三者的功能大致相同,但根据自身特点,在使用的时候可以根据场景选择更适合的;

        过滤器:

                1、过滤敏感词汇(防止sql注入等)

                2、设置字符编码

                3、URL级别的权限访问控制

                4、压缩响应信息

        拦截器:

                1、登录验证,可以根据request中的获取用户信息等来验证是否登录;

                2、权限控制,访问目标资源之前,进行权限检查,检查用户有无权限;

                3、处理cookie、本地化、国际化、主题等

                4、性能监控,监控请求处理时长等。

        aop:

                1、日志记录,记录请求操作日志,以便统计请求访问量.(粒度更细,比拦截器更合适)

二、使用

filter

        方式1:bean方式(无法注入IOC中的bean)

/**
 * Filter是依赖于Servlet的,需要有Servlet的依赖。
 * init() 在容器初始化时执行,只执行一次。
 * doFilter() 目标请求之前拦截执行,拦截之后需要放行才开始执行目标方法。filterChain.doFilter(servletRequest,servletResponse);
 * destroy() 在容器销毁时执行,只执行一次。
 * Filter可以拦截所有请求。包括静态资源[css,js…等]。
 * 基于函数回调实现。
 * 过滤器只能在容器初始化时被调用一次。
 */
public class TestFilter2 implements Filter {

//    @Autowired
//    AsyncService asyncService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @SneakyThrows
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

//        asyncService.task(2);
        System.out.println("进入注解方式filter   bean 方式");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
@Configuration
public class filterConfig {
    @Bean
    public FilterRegistrationBean heFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean(new TestFilter2());
        // 匹配规则
        registration.addUrlPatterns("/*");
        // 过个过滤器的执行顺序,数字越小优先级越高
        registration.setOrder(1);
        return registration;
    }

}

        方式二:注解(可以注入IOC中的bean)

@Component
// filterName就是当前类名称,还有一个urlPattens的参数,这个参数表示要过滤的URL上的后缀名,是多参数,可以用数组表示。
@WebFilter(value = "/*") // (filterName = "f1", urlPatterns = {"*.html","*.jsp","/hello"})
public class TestFilter implements Filter {

    @Autowired
    AsyncService asyncService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @SneakyThrows
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        asyncService.task(1);
        System.out.println("进入注解方式filter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

Interceptor

@Component
public class InterceptorTest implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器preHandle在控制器方法执行前执行");
        //true:表示放行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器postHandle在控制器方法执行后执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器afterCompletion在请求完成后执行");
    }
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Resource
    private InterceptorTest interceptorTest;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // ** 表示所有拦截路径
        registry.addInterceptor(interceptorTest).addPathPatterns("/**");
//        // 或下面这种写法  【若编写自定义拦截器类没有加@Component注解】
//        registry.addInterceptor(new interceptorTest()).addPathPatterns("/**");
    }
}

aop

springboot中的aop配置(hello world)及统一异常处理_springboot aop异常处理_子书少卿的博客-CSDN博客

todo:

        过滤器修改请求参数
        过滤器中注入bean的方式(有出入)
        多过滤器时(两种方式混合),默认顺序和顺序控制

                

参考资料:拦截器、过滤器、AOP的区别和联系_过滤器和aop_可爱发的博客-CSDN博客

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

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

相关文章

52.现有移动端开源框架及其特点—PocketFlow-2

PocketFlow 性能 通过引入超参数优化组件,不仅避免了高门槛、繁琐的人工调参工作,同时也使得 PocketFlow 在各个压缩算法上全面超过了人工调参的效果。以图像分类任务为例,在 CIFAR-10 和 ImageNet 等数据集上,PocketFlow 对 ResNet 和 MobileNet 等多种 CNN 网络结构进行…

LT8471IFE#PBF-ASEMI代理亚德诺LT8471IFE#PBF原厂芯片

编辑-Z LT8471IFE#PBF参数描述: 型号:LT8471IFE#PBF 输入电压:2.6-50V 静态电流:2.2 mA 停机时的静态电流:0.01μA 正反馈电压:789 mV 反馈引脚偏置电流:30 nA 开关频率范围&#xff1a…

产品经理该怎么催进度?

这算是一个项目管理相关的问题,很多公司会把产品经理与项目经理的工作职能划分并没有这么清晰,而且项目是否能够按时上线,在整个项目推进过程中也是至关重要的。如果是公司的自研产品,项目没办法定期交付,挨老板一顿骂…

Barotrauma潜渊症私人服务器架设教程

准备工具: 服务器一台(Ubuntu系统) 家用电脑一台(有网就行) 准备阶段 通过SSH登入服务器。 服务端需要下载三个软件。 窗口管理工具 Screen 。用于将服务器挂在后台中运行。 SteamCMD 。用于下载潜渊症服务器。 …

【YOLO 系列】YOLO v4-v5先验知识

文章目录 输入端Mosaic数据增强Self-Adversarial TrainingCmBN 主干网络Mish激活函数DropBlock 正则化CSPNetFocus结构 NeckPANet 输出目标损失函数IoU LossGIoU LossDIoU LossCIoU Loss总结 DIOU_nms 参考 YOLO v4和v5版本在v3版本的基础上,组合了多种先进算法提升…

OLAP分析型数据库clickhouse的选型、安装与试用

一、背景: 目前,在做项目时,遇到使用oracle数据库进行大表查询分析时,查询比较慢,而且随着表数据逐渐积累,数据量过亿(按月估计)。架构师针对几个关键要点(非实时数据、核心场景查询分析、对事务要求低、数…

谷粒商城二十四springCloud之Sleuth+Zipkin 服务链路追踪

为什么用 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。 主要体现在,一个请求可能需要调…

进程同步及经典问题

目录 1、基本概念 1.1两种形式的制约关系 1.2临界资源 1.3临界区 1.4同步机制应遵循的规则 2、硬件同步机制 3、信号量机制(重要) 3.1整型信号量 3.2记录型信号量 3.3AND型信号量 3.4信号量集 4、信号量的应用 4.1利用信号量实现进程互斥 4.2利用信号量实现前趋关系 …

【Spring】初识MyBatis (一)

MyBatis概述 MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口和Java的POJO(Plain Old Ja…

Qt libqrencode二维码——QtWidgets

前言 之前写过二维码的程序,但是在U盘上,没带,又重新找的网上资料写的。 网上二维码的生成,大多用到是第三方库libqrencode,这也一样: 效果图 本来是个动图的,都被和谐了,所以换成截图&…

2023年必学的一款测试工具,10 分钟上手

近两年有一款 UI 测试工具非常火爆,名字叫 cypress, 官方号称超越 selenium, 是面向下一代的测试工具。 那 cypress 到底要不要学呢?学起来容易吗?我们一起来看一下。 资料传送门:《软件测试全套基础/进阶/转行资料》 安装 cy…

【计算机视觉】最强 Zero-Shot 视觉应用:Grounding DINO + Segment Anything + Stable Diffusion

文章目录 一、前言二、功能介绍2.1 功能一2.2 功能二2.3 其他有趣的功能 三、总结 一、前言 用 Midjourney 花一个小时做的项目 logo 图: 解释一下 logo 的含义:一只坐在地上的马赛克风格的熊。 坐在地面上是因为 ground 有地面的含义,然后分…

数据流传输适配器系列产品设计资料保存:220-基于光纤的数据流传输适配器系列产品

220-基于光纤的数据流传输适配器系列产品 一、产品概述 光纤传输适配器为公司主力产品,主要包括10Gbps传输,40Gbps传输和100Gbps光纤传输,适配CameraLink(双base或者1路Full)、HDMI、HD-SDI;多路AD&#x…

TikTok数据报告要怎么看?

TikTok数据报告是一种分析和汇总TikTok平台上数据的报告,包含TikTok平台上的用户数据、视频数据、广告数据等。TK卖家每年可以通过分析TK数据报告来更好地了解受众和市场趋势,从而制定更加精准的营销策略和提升销售业绩。TikTok数据报告也可以帮助商家更…

分布式锁Redission对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对

文章目录 1 Redission介绍2 Redission快速入门3 Redission可重入锁原理4 Redission锁重试和WatchDog机制5 Redission锁的MutiLock原理 基于setnx实现的分布式锁存在下面的问题: 重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&…

JavaScript 特性 this与“bind“和“call“,“apply“的理解

本文的目的是帮助JavaScript初学者更好地理解"bind"方法,并帮助那些对"this"的理解不太清楚的人更好地理解"bind"方法和"this"之间的关系。特别是对于那些对"this"的理解不太清楚的人是有所帮助的。在深入学习&q…

通信端点(应用端点)与套接字的关系

为了实现以太网通信的分层与解耦,应用程序通常并不直接驱动TCP/IP协议栈发送以太网数据包。它们通过所在系统提供的一个叫做套接字的东西,调用套接字的接口函数创建套接字处理程序。用套接字处理程序发送自己的应用数据。 返回的套接字处理程序,就代表了这个应用程序。这就…

一篇文章搞定《RecyclerView缓存复用机制》

------《RecyclerView缓存复用机制》 前言零、为什么要缓存一、RecyclerView如何构建我们的列表视图二、缓存过程三、缓存结构1、mChangedScrap/mAttachedScrap2、mCachedViews3、mViewCacheExtension4、mRecyclerPool 四、总结 前言 本篇文章,暂时不加入预加载进行…

沃尔玛入驻教程:中国卖家如何免费、快速入驻沃尔玛walmart.com?

作为一家全球知名的零售巨头,沃尔玛(Walmart)的在线商城walmart.com拥有庞大的消费者基础和巨大的商机。对于中国的卖家来说,入驻沃尔玛的平台是一个很好的机会,但是有没有什么方法可以免费、快速入驻呢?有…

CTF-PHP反序列化漏洞4-实例理解POP链(经典赛题)

作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的…