拦截器、过滤器、AOP的区别和联系

2023-05-16

写在前面

今天,和一位前辈聊了聊实习的事,关于java后端开发的几个问题,真的是被虐的很惨啊(理解和能讲明白完全就是两回事啊)

其中,最沙雕的是,我竟然单纯的以为过滤器(Filter)和 拦截器(Interceptor)是一个东西,然后前辈当场就diss我一顿

后来我回家翻了翻笔记发现我在学SpringMVC的时候是有学过拦截器的(还注明了重点两个字),还将其应用到了登录验证功能上

image-20220204195429856

后来我反思了下,SSM学完后,直接做了一个书店系统(很简单的CRUD)就结束了,然后就直接SpringBoot了,

在里面是直接用的SpringSecurity进行的权限限制,渐渐地我就把拦截器给忘记了,

至于为啥把他当做过滤器,那是因为在学JavaWeb时确实把过滤器当做拦截器用过(比如登录功能)

至于为什么能那么写,就请耐心的看我接下来的内容吧(嘿嘿)

image-20220204200015298

一、什么是过滤器(Filter)

过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,

也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来。

image-20220204202844297

1.1、过滤器常见的使用场景

  • 统一设置编码
  • 过滤敏感字符
  • 登录校验
  • URL级别的访问权限控制
  • 数据压缩

1.2、Springboot 整合过滤器

  • Bean注入方式

    编写Filter

    public class HeFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
            System.out.println("您已进入filter过滤器,您的请求正常,请继续遵规则...");
            chain.doFilter(request, response);
        }
    
        @Override
        public void destroy() {
        }
    }
    

    编写Filter配置类

    @Configuration
    public class ServletConfig {
        @Bean
        public FilterRegistrationBean heFilterRegistration() {
            FilterRegistrationBean registration = new FilterRegistrationBean(new HeFilter());
            registration.addUrlPatterns("/*");
            return registration;
        }
    }
    
  • 注解方式

    @Slf4j
    @Component
    // filterName就是当前类名称,还有一个urlPattens的参数,这个参数表示要过滤的URL上的后缀名,是多参数,可以用数组表示。
    @WebFilter(value = "/hello")(filterName = "f1", urlPatterns = {"*.html","*.jsp","/hello"})
    public class HelloFilter2 implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                             FilterChain filterChain) throws IOException, ServletException {
            log.info("进入到过滤器2啦");
            // 这里可以进行一些条件判断(假如要做登录验证的话)
            filterChain.doFilter(servletRequest,servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    在主启动类上加@ServletComponentScan(“com.pandy.blog.filters”) 指明filter所在位置的包。 若有多个filter,默认根据filter类名的字母倒叙排列,且@WebFilter注解方式的过滤器优先级高于Bean注入方式配置的过滤器

1.3、过滤器(Filter)详解

a) Filter是依赖于Servlet的,需要有Servlet的依赖。

b) init() 在容器初始化时执行,只执行一次。

c) doFilter() 目标请求之前拦截执行,拦截之后需要放行才开始执行目标方法。filterChain.doFilter(servletRequest,servletResponse);

d) destroy() 在容器销毁时执行,只执行一次。

e) Filter可以拦截所有请求。包括静态资源[css,js…]。

f) 基于函数回调实现。

g) 过滤器只能在容器初始化时被调用一次。

二、什么是拦截器(Interceptor)

概念

拦截器是springmvc提供的,类似于过滤器。主要用于拦截用户请求并作相应的处理。

image-20220204205945784

2.1、拦截器的使用场景

a) 日志记录

b) 权限校验

c) 登录校验

d) 性能检测[检测方法的执行时间]

其实拦截器和过滤器很像,有些使用场景。无论选用谁都能实现。需要注意的使他们彼此的使用范围,触发机制。

2.2、springboot整合拦截器

  • 编写自定义拦截器类实现HandlerInterceptor接口或继承其子类【推荐实现的方式,实现可以自动生成preHandle…】

    @Component
    public class InterceptorDemo 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在请求完成后执行");
        }
    }
    
  • 基于springmvc编写配置类

    @Configuration
    // 老版本呢是继承WebMvcConfigurerAdapter不过新版本已经放弃了,推荐用下面的方式。
    public class InterceptorConfig implements WebMvcConfigurer { 
    
        @Autowired
        private InterceptorDemo interceptorDemo;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // ** 表示所有拦截路径
            registry.addInterceptor(interceptorDemo).addPathPatterns("/**");
            // 或下面这种写法  【若编写自定义拦截器类没有加@Component注解】
            registry.addInterceptor(new InterceptorDemo()).addPathPatterns("/**");
        }
    }
    
    

2.3、拦截器详情

a) 拦截器是依赖于SpringMVC的,需要有mvc的依赖。

b) preHandle() 在目标请求完成之前执行。有返回值Boolean类型,true:表示放行

c) postHandle() 在目标请求之完成后执行。

d) afterCompletion() 在整个请求完成之后【modelAndView已被渲染执行】。

e) 拦截器只能拦截action请求。不包括静态资源==[css,js…]==。

f) 基于java反射机制实现。

g) 在拦截器的生命周期中,可以多次被调用。

关于拦截器的preHandle()方法的参数说明:
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
      
      }

      @param request        current HTTP request
      @param response       current HTTP response
      @param handler        chosen handler to execute, for type and/or instance evaluation   //选择要执行的处理程序,用于类型和/或实例计算

三、拦截器与过滤器的区别

一张图告诉你答案

image-20220204211710166

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

前端之前。

2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个

service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

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

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

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

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

【重点】过滤器和拦截器非常相似,但是它们有很大的区别:

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

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

拦截器可以调用IOC容器中的各种依赖,而过滤器不能

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

当有过滤器和拦截器时的执行流程:

image-20220204212000434

四、AOP与过滤器、拦截器的区别

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

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

拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。 AOP针对具体的代码,能够实现更加复杂的业务逻辑。

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

三者的使用场景

在编写相对比较公用的代码时,优先考虑过滤器,然后是拦截器,最后是aop。

比如:

权限校验,一般情况下,所有的请求都需要做登陆校验,此时就应该使用过滤器在最顶层做校验;

日志记录,一般日志只会针对部分逻辑做日志记录,而且牵扯到业务逻辑完成前后的日志记录,因此使用过滤器不能细致地划分模块,此时应该考虑拦截器,

然而拦截器也是依据URL做规则匹配,因此相对来说不够细致,因此我们会考虑到使用AOP实现,AOP可以针对代码的方法级别做拦截,很适合日志功能。

写在最后

最后我也明白了,学习这事不能急躁(心急吃不了热豆腐),不然就会想我一样浅尝辄止,只懂个大概或者是概念,

这是远远不够的,Java的路还很漫长,等待着我们去探索,加油!!!

image-20220204212951463

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拦截器、过滤器、AOP的区别和联系 的相关文章

  • 过采样提升信噪比

    结论 增加采样率可以使得信号的信噪比提升 公式 xff1a SNR xff1d 6 02N xff0b 1 76 xff0b 10 log fs 2B 问题的前提 假设一个纯净的信号 xff08 不含噪声 xff09 经过一个ADC采样 x
  • 如何解决KEIL报错 error in include chain (cmsis_armcc.h): expected identfieror

    经过一番寻找终于找到了这个令人心烦的解决方法 xff0c 首先说明这个错误是编译器的错误 xff0c 也就是它抽风不正常工作了 原因 In the most common case the syntax checker was not ab
  • 图像去水印——opencv实现

    图像去水印 opencv实现 功能简介 xff1a 通过拖动鼠标实现指定区域水印或是斑点的去除 实现原理 xff1a 利用opencv鼠标操作setMouseCallback函数框选 xff08 左上到右下 xff09 需要处理的区域 xf
  • 应用宝ysdk接入心得

    unity 应用宝ysdk接入 对于应用宝ysdk的接入 自身的感觉 还是比较简单的 xff0c 只是刚开始的时候感觉很可怕 xff0c 都是听别人说多难多难 xff0c 在没接触的时候就给自己造成了心理的阴影 xff0c 但是 当你去做的
  • MLT 框架设计文档翻译

    框架设计 前言目标群众 基本概述基础设计信息结构与流程用法Hello World工厂服务属性播放列表滤镜附加滤镜介绍混合 混合过渡 多轨道与过渡 前言 MLT是为电视广播设计的开源多媒体框架 严格来说 xff0c 它为使项目包含新的音视频源
  • Ubuntu 16.04 x11vnc在无显示器的时候很卡的解决方法

    原链接 运行测试平台 小强ROS机器人 在Ubuntu 16 04上使用x11vnc作为vnc服务器的时候 xff0c 发现非常的卡 但是一旦插上显示器之后就正常了 在网上搜索也没有找到解决方案 最后终于通过Xorg的log找到了原因 在
  • Hyper-V虚拟机没有声音怎么办?介绍两种“发声”方式(以Windows10为例)

    最近使用在VMware上的Windows虚拟机发现稍微有点卡 xff0c 之前有听说过Windows原生的虚拟机工具Hyper V所以像尝试一下 xff0c 安装的教程这里就不做过多的演示了 xff0c 相信有很多人碰到虚拟机没有声音的问题
  • PX4启动gazebo仿真时无法连接地面站和ros解决办法

    利用脚本启动gazebo仿真后无人机的模型可以出来 xff0c 但是无人机的桨叶一直在转 xff0c 且无法连接地面站和ros xff0c 原因时模型没有编译 xff0c 找到所用模型所在的Firmware文件夹下编译模型 Firmware
  • PX4利用GAZEBO多机仿真

    PX4利用GAZEBO多机仿真 参考https docs px4 io master zh simulation multi vehicle simulation gazebo html 以五架为例 xff0c m后面表示用哪个模型 xff
  • viso常用设置

    viso常用设置 自动连接 自动对齐 xff0c 选中流程图的组件 设置自动对齐和自动调整间距 xff0c 或者在 位置 里设置间距
  • QT编译后生成可以放到别的电脑执行的可执行文件

    QT编译后生成可以放到别的电脑执行的可执行文件 参考链接 https www cnblogs com xiaohai123 p 13564063 html 编译的时候选择release pro文件的TEMPLATE 61 lib改成TEMP
  • ubuntu解压rar文件

    ubuntu解压rar文件 ubuntu默认是不能解压rar文件的 如果要解压 xff0c 需要安装解压工具 ubuntu 下rar解压工具安装方法 xff1a 1 压缩功能 安装 sudo apt get install rar 卸载 s
  • ubuntu18.04安装截图软件flameshot

    ubuntu18 04安装截图软件flameshot 安装命令 xff1a sudo apt get install flameshot 安装完后在软件里找到下图图标点击打开 然后在收藏夹栏右击添加到收藏夹 xff0c 然后就可以点击收藏夹
  • PX4更改仿真的默认初始GPS位置

    xff30 xff38 4更改仿真的默认初始 xff27 xff30 xff33 位置 参考连接 https dev px4 io master zh simulation jmavsim html 先执行 export PX4 HOME
  • ubuntu18.04安装搜狗输入法

    ubuntu18 04安装搜狗输入法 先安装fcitx框架 sudo add apt repository ppa fcitx team nightly 添加FCITX仓库 sudo apt get update 更新仓库 sudo apt
  • PX4通过参数脚本给飞控导入参数

    PX4通过参数脚本给飞控导入参数 先找一架正常能飞的无人机连接地面站 在参数页面右上角点击工具 gt 保存到文件 保存的时候文件名注明参数的相关信息 然后将需要加载参数的无人机连接至地面站 xff0c 注意需要加载参数的无人机必须和保存的参
  • 百度2014校园招聘笔试题(武汉站 9.28)

    一 简答题 xff08 本题共30分 xff09 动态链接库与静态链接库分别有什么优缺点 xff1f xff08 10分 xff09 轮训任务调度和抢占式任务调度有什么区别 xff1f xff08 10分 xff09 请列出数据库中常用的锁
  • PX4常用起飞检查参数

    电源检查 xff35 xff33 xff22 连接检查 安全开关检查 如果报错加速度偏移过大 xff0c high Accelerometer bios 可以把com arm ekf ab这个参数调大一些 同理可以通过改下面这个参数把陀螺仪
  • ubuntu18.04安装谷歌浏览器

    wget https dl google com linux direct google chrome stable current amd64 deb sudo apt get f install sudo dpkg i google c
  • PX4添加自定义日志消息

    固件版本 xff11 11 一 将要观察的数据声明成uORB消息 xff0c 并发布 我这里随便添加了一个 在logged topics cpp里的add default topics函数里加上一行add topic fanbu 100 或

随机推荐

  • PX4硬件在环仿真

    以四旋翼为例 参考链接 https dev px4 io master zh simulation hitl html xff11 将飞控连接到地面站 xff0c 机架类型选择HIL Quadcopter X xff12 激活 HITL 模
  • AD18设置不显示丝印

    双击下图的图标 将下图的小眼睛符号点一下关闭显示
  • 仿pix2.4.6从与原理图导出PCB时所有元件都提示找不到封装解决办法

    打开pcb页面 xff0c 点击设计 gt 生成pcb库 原理图元件的封装设置为任意 如果生成PCB库的时候生成的不全 xff0c 可以生成集成库 点击设计 生成集成库 xff0c 生成后如下 生成后双击一个原理图封装 xff0c 在下图红
  • 查看PX4主模式和从模式的值

    在QGC中的图中位置添加如下 qDebug lt lt 主模式 lt lt heartbeat base mode qDebug lt lt 从模式 lt lt heartbeat custom mode 编译qgc并链接无人机 切换无人机
  • ubuntu安装向日葵远程控制软件

    下载向日葵命令行版本 https sunlogin oray com download 在下载目录打开终端 执行 sudo apt install 下载的文件名 y f 如 sudo apt install SunloginClient 1
  • px4 1.11.0设置使能两个数传口

    可以在telem2上再接一个数传 xff0c 两个数传都可以和地面站通信
  • ubuntu下ulog文件转csv文件并在matlab里画图

    在需要转化的ulog文件目录下 执行 ulog2csv XXX ulog xff0c 会自动在当前目录下生成一系列csv文件 将csv文件拖到matlab界面中 xff0c 会弹出下面的页面 xff0c 点击导入 会提示导入到工作区 xff
  • 求字符串中的最长回文子串

    方法一 xff08 暴力法 xff09 xff1a include lt stdio h gt include lt string h gt bool Palindrome const char str int start int end
  • PX4利用jmavsim进行多机仿真

    编译 PX4 make px4 sitl default运行 sitl multiple run sh 指定要启动的飞行器的实例数目 例如 2 Tools sitl multiple run sh 2打开另一个终端 xff0c 启动第一个实
  • 基于ubuntu系统下的USB设备绑定

    一 基于ubuntu系统下的USB设备绑定 1 解决问题 xff1a 在Ubuntu系统的使用中 xff0c 没有对USB进行设备进行绑定的话 xff0c 每次插拔或者顺序的不同 xff0c 都会造成ttyUSB端口号的改变 xff0c 不
  • ROS机器人从零开始——Ubuntu18.04安装melodic

    https blog csdn net jiejiemcu article details 105314870 utm medium 61 distribute pc relevant none task blog baidujs titl
  • ROS+PX4学习与开发 0.0 、目录

    相关视频讲解https www bilibili com video BV1AD4y1c7Tg 1 1学习结构 1 2预备知识 1 3 ROS无人机简介 1 4 PX4程序下载 1 5 PX4 载具选择 1 6 PX4初始化校准 1 7 P
  • ROS+PX4学习与开发1.2、预备知识

    查看相关视频讲解 话不多说 xff0c 直奔主题 本次配套的文章以无人机作为载体进行ROS与PX4的结合使用 无人机本身是一个复杂的 庞大的无人设备 xff0c 涉及到的知识面非常广 xff0c 好在PX4和ROS都已经将无人机的各种功能进
  • ROS+PX4学习与开发1.3、ROS无人机简介

    查看相关视频讲解无人机简介 PX4详细介绍网址如下 xff1a https www ncnynl com archives 201810 2624 html 主要组成部分 xff1a 红色部分为ROS升级版功能实现 1 飞控 xff08 基
  • 基于PX4的无人船组装

    基于PX4的无人船组装 配件购买地址 无人机本身是一个复杂的 庞大的无人设备 xff0c 涉及到的知识面非常广 xff0c 好在PX4和ROS都已经将无人机的各种功能进行了封装 xff0c 这就给初学者提供了极大的便利 考虑到二次开发的使用
  • 虚拟机中ubuntu安装vm-tools后仍然不能复制粘贴

    虚拟机中ubuntu安装vm tools后仍然不能复制粘贴 ubuntu18 04及后续版本 xff0c 不再安装vm tools xff0c 改用成安装open vm tools xff0c 安装命令如下 xff1a 执行以下命令并重启
  • AD09 DXP保姆级教程系列——001、汉化与新建工程

    汉化 1 打开软件 2 选中此处DXP xff0c 选中优先选项 3 点击使用本地资源 xff0c 及Use localized resources后重启打开 xff0c 无需安装汉化包之类的 4 重启后即可看到已经完成汉化 新建一个工程
  • AD09 DXP保姆级教程系列——002、恢复默认界面

    恢复默认界面 1 选择查看下的桌面布局 xff0c 选择默认即可恢复初始化界面
  • log4j2常用配置

    文章目录 1 概述2 配置详解2 1 appender组件列表2 2 ConsoleAppender2 3 RollingFileAppender2 3 1 TriggeringPolicy2 3 2 RolloverPolicy2 3 2
  • 拦截器、过滤器、AOP的区别和联系

    写在前面 今天 xff0c 和一位前辈聊了聊实习的事 xff0c 关于java后端开发的几个问题 xff0c 真的是被虐的很惨啊 xff08 理解和能讲明白完全就是两回事啊 xff09 其中 xff0c 最沙雕的是 xff0c 我竟然单纯的