【SpringBoot】过滤器,监听器,拦截器介绍

news2024/11/14 3:57:27

文章目录

    • 一、简介
      • 1、过滤器
      • 2、拦截器
      • 3、监听器
    • 二、如何创建
      • 1、过滤器
      • 2、监听器
      • 3、拦截器
    • 三、总结

一、简介

在这里插入图片描述

在这里插入图片描述

通过两幅图我们可以理解拦截器和过滤器的特点

1、过滤器

过滤器是在请求进入tomcat容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

理解上面这句话我们就可以知道,进入servlet之前,主要是两个参数:ServletRequest,ServletResponse 那我们得到这两个测试可以干哪些事呢?

我们可以通过ServletRequest得到HttpServletRequest,此时你就可以对请求或响应(Request、Response)那就可以对对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息、字符集统一等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。(每次热部署后,都会销毁)。

2、拦截器

从上图我们可以看出过滤器只在servlet前后起作用,所以它既不能捕获异常,获得bean对象等,这些是只能是进入servlet里面的拦截器能过做到。拦截器中用于在某个方法或字段被访问之前,进行拦截然后,在之前或之后加入某些操作。比如日志,安全等。一般拦截器方法都是通过动态代理的方式实现。可以通过它来进行权限验证,或者判断用户是否登陆,或者是像12306 判断当前时间是否是购票时间。

对比一下其实我们可以发现,过滤器能做的事拦截器都能做,二拦截器做的事过滤器不一定做的了。

3、监听器

listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:

  • 1、统计在线人数和在线用户
  • 2、系统启动时加载初始化信息
  • 3、统计网站访问量
  • 4、记录用户访问路径。

常用的监听器 servletContextListener、httpSessionListener、servletRequestListener)

二、如何创建

1、过滤器

自定义Filter 使用Servlet3.0的注解进行配置第三步的@WebFilter就是3.0的注解

1)启动类里面增加 @ServletComponentScan,进行扫描

2)新建一个Filter类,implements Filter,并实现对应的接口

3)@WebFilter 标记一个类为filter,被spring进行扫描

urlPatterns:拦截规则,支持正则

4)控制chain.doFilter的方法的调用,来实现是否通过放行不放行,web应用resp.sendRedirect(“/index.html”);场景:权限控制、用户登录(非前端后端分离场景)等

application类

@SpringBootApplication
@ServletComponentScan
public class SpringbootstudyApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootstudyApplication.class, args);
    }
}

LoginFilter过滤器

//过滤器拦截路径
@WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")
public class LoginFilter  implements Filter{
          
     /**
      * 容器加载的时候调用
      */
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
          System.out.println("拦截器进入========拦截器进入========");
      }
      
      /**
       * 请求被拦截的时候进行调用
       */
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
          System.out.println("拦截中========拦截中========");

          HttpServletRequest hrequest = (HttpServletRequest)servletRequest;
          HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
          if(hrequest.getRequestURI().indexOf("/index") != -1 ||
                  hrequest.getRequestURI().indexOf("/asd") != -1 ||
                  hrequest.getRequestURI().indexOf("/online") != -1 ||
                  hrequest.getRequestURI().indexOf("/login") != -1
                  ) {
              filterChain.doFilter(servletRequest, servletResponse);
          }else {
              wrapper.sendRedirect("/login");
          }
          
      }

      /**
       * 容器被销毁的时候被调用
       */
      @Override
      public void destroy() {
          System.out.println("拦截器销毁========拦截器销毁========");
      }

}

1、官网地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

2、监听器

@WebListener
public class RequestListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // TODO Auto-generated method stub
        System.out.println("======销毁监听器========");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("======进入监听器========");
        
    }

3、拦截器

CustomWebMvcConfigurer主拦截器需要:

1:添加@Configuration注解

2:实现WebMvcConfigurer接口
//主拦截器,根据拦截不同路径跳转不同自定义拦截器 (实现WebMvcConfigurer方法)
@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer  {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api1/*/**");
        registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");
        
        //.excludePathPatterns("/api2/xxx/**"); //拦截全部 /*/*/**
        
        WebMvcConfigurer.super.addInterceptors(registry);
    }

}

LoginIntercepter子拦截器

public class LoginIntercepter implements HandlerInterceptor{

    /**
     * 进入controller方法之前
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("LoginIntercepter------->preHandle");

//        String token = request.getParameter("access_token");
//        
//        response.getWriter().print("fail");
        
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    /**
     * 调用完controller之后,视图渲染之前
     */
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        
        System.out.println("LoginIntercepter------->postHandle");
        
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 整个完成之后,通常用于资源清理
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("LoginIntercepter------->afterCompletion");
        
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
    
    
}

TwoIntercepter同上

三、总结

最后总解一下他们:

过滤器:用于属性甄别,对象收集(不可改变过滤对象的属性和行为)

监听器:用于对象监听,行为记录(不可改变监听对象的属性和行为)

拦截器:用于对象拦截,行为干预(可以改变拦截对象的属性和行为)

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

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

相关文章

模拟IC与数字IC设计该怎么选?哪个岗位薪资高?

很多同学想要入行IC,但不知道数字和模拟方向怎么选? 如果没有亲身体会过模拟设计,并有发自内心的自信或者兴趣,一般不看好纯小白去学模拟电路设计。 模拟设计想做好,没有数学功底,没有电路分析的功底&…

面试题30天打卡-day24

1、Redis 为什么快? Redis 之所以快,主要是因为它具有以下特点: 纯内存操作:Redis 的数据存储在内存中,因此读写速度非常快,而无需像传统数据库一样从硬盘读取和写入数据。与此同时,Redis 支持…

【算法】动态规划算法求(编辑距离)

目录 编辑距离: 举例: 代码如下 调试: 核心代码: 画图演示上述代码: 编辑距离: 是一种计算两个自符串之间差异程度的方法,它通过比较两个字符串之间的插入,删除和 替换操作的数…

深度神经网络模型部署——Docker学习

容器技术中有三个核心概念:容器(Container)、镜像(Image),以及镜像仓库(Registry) 从本质上来说,容器属于虚拟化技术的一种,和虚拟机(Virtual Mac…

CentOS7安装vsftpd

CentOS7安装vsftpd 最近又用到ftp了,摸索了一下终于安装成功,记录下安装过程,本次使用的操作系统为 CentOS7,ftp使用vsftpd。 安装vsftpd yum install -y vsftpd配置vsftpd vsftpd的配置文件路径为:/etc/vsftpd/vs…

软件测试基础面试题大全(上)

1. 软件生命周期是什么? 软件生命周期:需求调研(可行性研究)、需求分析(需求规格说明书)、设计(系统架构、模块设计、表结构设计、接口设计等,产出概要设计文档和详细设计文档&…

表达式求值问题-双栈模板化实现

好久不见,真的很久都没有更新博客了,最近很多事情,所以比较忙碌,没有时间每天都学算法,但是我会挤时间尽量做到,每两三天就更新博客,我会努力的,加油~ 前言:计算器都见过…

加码本地生活、成为“万能入口”,抖音完成了百度曾经的梦想

文|螳螂观察 作者| 小别 前有美团点评,后有阿里巴巴,本地生活服务从来就不平静。 并没有在最好的时间出发的抖音,还是顺着短视频的内容优势,从团购、本地游、外卖再到近期推出商城频道,逐步完善了本地生活服务的布局…

浅谈jmeter性能测试步骤入门

一、Jmeter简介 1 概述 jmeter是一个软件,使负载测试或业绩为导向的业务(功能)测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ(现在称为如 Apache Tomca…

linux命令文本命令之~~~ sort ~~ tr ~~cut ~~ uniq

目录 一. sort命令二. uniq 命令三. tr命令四. cut命令 一. sort命令 以行为单位对文件内容进行排序,也将他根据不同的数据类型来排序 比较原则是从首字符向后,依次按ASCII码进行比较,最后按照升序输出排序 语法格式: sort 【选…

Web自动化测试:selenium的使用以及关于driver=webdriver.Firefox()无驱动报错问题

Selenium 1.什么是Selenium? Selenium是一个用于Web应用程序测试的工具。 主流的自动化测试工具有: web自动化测试:selenium、robot frameworkApp端自动化测试:Appium、Monkeyrunner、UIautomationPC客户端(win32&…

打印机错误0x00000bc4,Win11系统找不到打印机怎么办

近期,又有不少小伙伴更新了Win11系统后,出现了打印机提示错误代码0x00000bc4,出现错误后,可能导致打印机无法正常工作,打印任务无法完成,或者打印机无法连接到电脑等问题。驱动人生就为大家带来打印机错误0…

使用docker部署wiki.js

安装docker这些就不讲了,教程一堆,相关的安装教程可以去官网看,只是没那么详细,尤其是有关数据库的配置:Docker 部署 Wiki.js pull wiki镜像: docker pull ghcr.io/requarks/wiki 如果是arm的机器&#xf…

Oracle存储过程~封神之作

简介 Oracle 存储过程是 Oracle 数据库中的一种数据处理对象,它可以在数据库中定义一组预定义的 SQL 语句,用于完成特定的数据库操作。存储过程可以被授权的用户调用,并且可以执行多个语句,这些语句可以被视为一个单独的操作&…

【逗老师的无线电】快速记录一下MMDVM串口屏相关

最近在研究MMDVM的串口屏,设计知识点比较多,本文先随手记一下,同时随时更新,最后形成完整的文档 一、Nextion和国内串口屏设计 MMDVM默认对接的是Nextion屏幕。但是有人跟我说,NXT的屏幕和国内陶晶驰的屏幕就是一个…

每周一算法:差分算法

差分算法 差分是一种常见的算法,用于快速修改数组中某一段区间的值。其基本思想就是预处理出数组的差分数组,然后修改区间时,只需要修改两个位置的值,即可快速完成区间修改。最后再通过差分数组求出原数组。差分算法在区间加、区…

kafka安装及配置

1. 下载 下载地址:Apache Kafka 我这里下载的是 3.2.1 版本。 2. 上传并解压 上传到 linux 下的 /home/software/ 目录下,然后解压 kafka_2.13-3.2.1.tgz 包到/usr/local/ cd /home/software tar -zxvf kafka_2.13-3.2.1.tgz -C /usr/local # -C 选…

【机器学习】信息量、香农熵、信息增益(增加例子,方便理解)

这节可以搭配 【机器学习】Logistic回归(重新整理)信息量(信息)信息量公式的推理过程 香农熵信息增益 【机器学习】Logistic回归(重新整理) B站视频:“交叉熵”如何做损失函数?打包…

医学影像系统源码,三维后处理和重建 PACS源码

医学影像系统源码,三维后处理和重建 PACS源码 医学影像系统由PACS系统、RIS系统组成,提供与HIS的接口(HL7或其他类型)。 主要功能介绍 信息预约登记 支持对患者、检查项目、申请医生、申请单据、设备等信息进行管理。且支持检查…

Apache网站部署SSL证书开启https访问,强制http跳转https

centos服务器博客网站安装教程可见:Centos 7.X WordPress博客网站详细教程 FTP/PHP/mysql/Apache环境构建_autotian的博客-CSDN博客本文详细的介绍了centos7.x系统下,如何构建FTP、mysql、PHP、Apache环境,并成功安装WordPress博客网站。http…