一文详解Springboot中filter的原理与注册

目录
  • 1、filter
    • 1.1 filter的接口定义
    • 1.2 自定义filter
  • 2、springboot中filter注册几种方式
    • 2.1 手动注册
    • 2.2 注解注册
    • 2.3 通过servletContext 注册
  • 3、原理
    • 3.1 ServletContext
    • 3.2 ServletRegistrationBean
  • 4、总结

1、filter

先看下web服务器的filter所处的位置。filter是一个前后连接的链,前面处理完成之后传递给下一个filter处理。

1.1 filter的接口定义

public interface Filter {
    //初始化方法,整个生命周期中只执行一次。
    //在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。
    //参数FilterConfig用于获取初始化参数
    public void init(FilterConfig filterConfig) throws ServletException;

    //执行过滤任务的方法,参数FilterChain表示过滤器链,doFilter方法中只有执行chain.doFilter()后才能调用下一个过滤器的doFilter方法
    //才能将请求交经下一个Filter或Servlet执行
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

    //销毁方法,当移出服务时由web容器调用。整个生命周期中destroy方法只会执行一次
    //destroy方法可用于释放持有的资源,如内存、文件句柄等
    public void destroy();
}

filter的入参是request和response,filter一般是用来做一些预处理工作,比如做一些检查,验证等工作。

1.2 自定义filter

public class LoginFilter implements Filter {
    @Override
    public void destroy() {
        System.out.println("filter destroy method");
    }
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("filter doFilter method ");
        // 继续传递下去
        filterChain.doFilter(arg0,arg1);
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("filter init method");
    }
}

2、springboot中filter注册几种方式

2.1 手动注册

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean indexFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean(new LoginFilter());
        registration.addUrlPatterns("/");
        return registration;
    }
}

2.2 注解注册

2.2.1 在filter上增加注解@WebFilter

@WebFilter(urlPatterns = "/",filterName = "filter1")
@Order(1)
public class LoginFilter implements Filter {
    @Override
    public void destroy() {
        System.out.println("filter destroy method");
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("filter doFilter method   1   ");
        filterChain.doFilter(arg0,arg1);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("filter init method");
    }
}

2.2.2 在启动类上增加注解@ServletComponentScan

@SpringBootApplication
@ServletComponentScan
public class FilterTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(FilterTestApplication.class, args);
    }
}

注:

@ServletComponentScan 会扫描所有的带有@WebFilter的类,并且注册为servlet。

如果启动类不添加此注解,在filter上添加Component注解也可以注册为filter

order注解可以调整filter的顺序

2.3 通过servletContext 注册

@Autowired ServletContext servletContext; servletContext.addFilter()

3、原理

3.1 ServletContext

Web容器在启动时会为每个web应用创建一个ServletContext对象,而这个ServletContext对象就代表当前这个web应用。

一个ServletContext对象代表一个web应用,web应用中所有的Servlet和其他资源都共享一个ServletContext对象,

如果有必要我们就可以通过ServletContext对象进行Servlet之间的通讯。

ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。

ApplicationContext 是ServletContext的实现类,可以看到里面有相应的注册的方法

在程序中获取ServletContext

3.1.1 使用自动注入

@Autowired private ServletContext servletContext;

3.1.2 request获取servletContext

ServletContext servletContext = request.getServletContext();

3.1.3 实现 ServletContextListener

@Component
public class TestListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println(sce);
    }
}

3.2 ServletRegistrationBean

看下Filter的定义,可以看到和webfilter注解内容一样

public class ServletRegistrationBean<T extends Servlet> extends DynamicRegistrationBean<ServletRegistration.Dynamic> {
    private static final String[] DEFAULT_MAPPINGS = new String[]{"/*"};
    private T servlet;
    private Set<String> urlMappings;
    private boolean alwaysMapUrl;
    private int loadOnStartup;
    private MultipartConfigElement multipartConfig;
    ......
    }

在开发中一般使用他的子类FilterRegistrationBean,使用上面2.1 手动注册

4、总结

filter 作为web服务器中的重要的一部分,一般常用来做一些前置处理和对调用请求的中断

filter的注册几种方式总结,在开发中一般灵活使用,没有特殊的请求,常规都够用

了解原理是为了更好的理解,filter的过滤链式Spring Security的重要切入点,理解了filter再理解其他的框架就不难了,甚至可以自己简单写出一个列斯的框架

到此这篇关于一文详解Springboot中filter的原理与注册的文章就介绍到这了,更多相关Springboot filter内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot 过滤器 Filter使用实例详解

    目录 简介 用法 功能 实现 简介 过滤器是AOP(面向切面编程)思想的具体实现.可以过滤浏览器发出的请求,并且决定放行请求还是中断请求. 在浏览器对服务器发起请求或者服务器对浏览器响应,都会经过过滤器. 基于过滤器的机制,我们可以在过滤器中对请求和响应做一些处理,可以在过滤器中决定是否放行,例如:校验请求中有没有敏感字符串,校验有没有Session,实现URL级别的权限控制.压缩响应信息.编码格式等. 用法 在spring的应用中我们存在两种过滤的用法,一种是拦截器.另外一种当然是过滤器.我们

  • Springboot 中的 Filter 实现超大响应 JSON 数据压缩的方法

    目录 简介 pom.xml 引入依赖 对Response进行包装 定义GzipFilter对输出进行拦截 注册 GzipFilter 拦截器 定义 Controller 定义 Springboot 引导类 测试 简介 项目中,请求时发送超大 json 数据外:响应时也有可能返回超大 json数据.上一篇实现了请求数据的 gzip 压缩.本篇通过 filter 实现对响应 json 数据的压缩.先了解一下以下两个概念: 请求头:Accept-Encoding : gzip告诉服务器,该浏览器支持

  • SpringBoot注册FilterRegistrationBean相关情况讲解

    目录 思路 手动注册代码 思路 首先编写程序时,或多或少会存在几个固定的Filter,那么第一步就是为确定的那几个Filter指定好顺序.(通常情况下的使用场景是:你要将你现在编写的项目打包成jar给别的项目使用) 其次程序确定的几个Filter已经编写好了,那么需要将它们和不确定的那几个放在一起进行重新排序. 将排好序的Filter进行注册. 补充:FilterRegistrationBean的使用 @Bean FilterRegistrationBean<AFilter> filterRe

  • SpringBoot项目找不到javax.servlet.Filter的问题及解决

    目录 SpringBoot找不到javax.servlet.Filter的问题 启动SpringBoot项目找不到报错 这是我配置的(有问题的) 正确的配置(在远程maven仓库中搜索的配置) SpringBoot找不到javax.servlet.Filter的问题 新创建一个SpringBoot项目,编译时出现了找不到javax.servlet.Filter的异常. 这个类位于tomcat-embed这个jar下面,这里的解决方法并不是像网上大部分所说的手动添加这个jar,因为这是由于没有添加

  • 一文详解Python中生成器的原理与使用

    目录 什么是生成器 迭代器和生成器的区别 创建方式 生成器表达式 基本语法 生成器函数 yield关键字 yield和return yield的使用方法 生成器函数的基本使用 send的使用 可迭代对象的优化 总结 我们学习完推导式之后发现,推导式就是在容器中使用一个for循环而已,为什么没有元组推导式? 原因就是“元组推导式”的名字不是这样的,而是叫做生成器表达式. 什么是生成器 生成器表达式本质上就是一个迭代器,是定义迭代器的一种方式,是允许自定义逻辑的迭代器.生成器使用generator表

  • 详解SpringBoot中Session超时原理说明

    一:前言: 最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是session超时,debug代码后发现session的超时时间是1800s.也就是说当1800秒内没有任何操作,session就会出现超时现象.那这个超时时间是如何设置的呢?然后该如何重新设置此超时时间呢?系统又如何判断session超时的呢?接下来就一一进行解答. 二:系统session超时时间如何默认的? 说明:获取session超时时间的方法为"request.getSess

  • 一文详解Python中的Map,Filter和Reduce函数

    目录 1. 引言 2. 高阶函数 3. Lambda表达式 4. Map函数 5. Filter函数 6. Reduce函数 7. 总结 1. 引言 本文重点介绍Python中的三个特殊函数Map,Filter和Reduce,以及如何使用它们进行代码编程.在开始介绍之前,我们先来理解两个简单的概念高阶函数和Lambda函数. 2. 高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式. 举例如下: def higher(your_function, som

  • 详解SpringBoot中的参数校验(项目实战)

    Java后端发工作中经常会对前端传递过来的参数做一些校验,在业务中还要抛出异常或者不断的返回异常时的校验信息,充满了if-else这种校验代码,在代码中相当冗长.例如说,用户注册时,会校验手机格式的正确性,用户名的长度等等.虽说前端也可以做参数校验,但是为了保证我们API接口的可靠性,以保证最终数据入库的正确性,后端进行参数校验不可忽视. Hibernate Validator 提供了一种统一方便的方式,让我们快速的实现参数校验. Hibernate Validator 使用注解,实现声明式校验

  • 详解SpringBoot中的tomcat优化和修改

    项目背景 在做项目的时候,把SpringBoot的项目打包成安装包了,在客户上面安装运行,一切都是那么的完美,可是发生了意外,对方突然说导出导入的文件都不行了.我急急忙忙的查看日志,发现报了一个错误 java.io.IOException: The temporary upload location [C:\Windows\Temp\tomcat.1351070438015228346.8884\work\Tomcat\localhost\ROOT] is not valid at org.ap

  • 详解SpringBoot中自定义和配置拦截器的方法

    目录 1.SpringBoot版本 2.什么是拦截器 3.工作原理 4.拦截器的工作流程 4.1正常流程 4.2中断流程 5.应用场景 6.如何自定义一个拦截器 7.如何使其在Spring Boot中生效 8.实际使用 8.1场景模拟 8.2思路 8.3实现过程 8.4效果体验 9.总结 1.SpringBoot版本 本文基于的Spring Boot的版本是2.6.7 . 2.什么是拦截器 Spring MVC中的拦截器(Interceptor)类似于ServLet中的过滤器(Filter),它

  • 一文详解Java中Stream流的使用

    目录 简介 操作1:创建流 操作2:中间操作 筛选(过滤).去重 映射 排序 消费 操作3:终止操作 匹配.最值.个数 收集 规约 简介 说明 本文用实例介绍stream的使用. JDK8新增了Stream(流操作) 处理集合的数据,可执行查找.过滤和映射数据等操作. 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询.可以使用 Stream API 来并行执行操作. 简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式. 特点 不是数据结构

  • 详解SpringBoot中@ConditionalOnClass注解的使用

    目录 一.@ConditionalOnClass注解初始 二.@ConditionalOnClass注解用法 1.使用value属性 2.使用name属性 三.@ConditionalOnClass是怎么实现的 四.总结 今天给大家带来的是springboot中的@ConditionalOnClass注解的用法.上次的@ConditionalOnBean注解还记得吗? 一.@ConditionalOnClass注解初始 看下@CodidtionalOnClass注解的定义, 需要注意的有两点,

  • 详解SpringBoot中如何使用布隆过滤器

    目录 前言 一.Guava 实现布隆过滤器 二.Hutool 布隆过滤器 三.Redission 布隆过滤器 四.小结 五.Guava 布隆过滤器结合 Redis 使用 昨天写了一篇Redis布隆过滤器相关的命令的文章,今天来说一说springboot中如何简单在代码中使用布隆过滤器吧. 目前市面上也有好几种实现方式,如果你需要高度定制化,可以完全从零实现,当然这不是一个简单的工程. 如果只是想快速开始的话,那么市面上现成的实现,无疑是最快的. 前言 今天说到的实现方式有以下几种: 引入 Gua

  • 一文详解kubernetes 中资源分配的那些事

    目录 概要 一个nginx的配置 我们进入nginx容器所在目录看下 cpu.shares cpu.cpu.cfs_period_us.cpu.cfs_quota_us 资源使用率数据来源 下kubelet相关配置:** 概要 在k8s中,kube-scheduler是Kubernetes中的调度器,用于将Pod调度到可用的节点上.在调度过程中,kube-scheduler需要了解节点和Pod的资源需求和可用性情况,其中CPU和内存是最常见的资源需求.那么这些资源的使用率是怎么来的呢?当Pod调

随机推荐