首页 > 其他分享 >Springboot项目实现过滤器功能

Springboot项目实现过滤器功能

时间:2023-12-07 13:23:47浏览次数:24  
标签:info 功能 log void Filter 过滤器 public Springboot

核心类

Filter

Filter接口的全限定类名是javax.servlet.Filter,该接口有三个方法,分别是

1、init(...):用于初始化Filter;

2、doFilter(...):过滤请求和拦截响应信息的具体实现在这个方法里;

3、destroy(...):Filter对象被销毁时触发,主要用于做一些收尾工作,如资源的释放等;

FilterConfig

FilterConfig接口的全限定类名是javax.servlet.FilterConfig,该接口主要有四个方法,分别是:

1、getFilterName() 获取Filter的名字;

2、getServletContext() 获取ServletContext对象(即application);

3、getInitParameter() 获取Filter的初始化参数;

4、getInitParameterNames() 获取所有初始化参数的名字;

FilterChain

FilterChainr接口的全限定类名是javax.servlet.FilterChain,该接口只有一个方法,是doFilter()方法,用于调用Filter链上的下一个过滤器,

如果当前过滤器为最后一个或只有一个过滤器,则该过滤器则将请求发送到目标资源。

MyFilter2是自己实现的过滤器,实现了Filter接口;Filter接口依赖FilterChain接口和FilterConfig接口,

其中FilterChain接口的实现类是org.apache.catalina.core.ApplicationFilterChain,

FilterConfig接口的实现类是org.apache.catalina.core.ApplicationFilterConfig;

实现方式

Springboot项目中一般有两种方式:

1、@WebFilter注解,即javax.servlet.annotation.WebFilter;

2、FilterRegistrationBean,即org.springframework.boot.web.servlet.FilterRegistrationBean;

两种方式,都需要在启动类上增加注解@ServletComponentScan,用于开启servlet相关bean的扫描,其中包含有过滤器(Filter);

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

代码实现

1、WebFilter注解里,定义一下过滤器的名字,以及要对哪些请求进行过滤,“/*”表示对所有的请求都过滤,在实际业务中,可具体对待;

如果在初始化的时候,需要携带一些初始化的参数,可以在initParams属性上,使用@WebInitParam注解来定义初始化参数名称和具体的值,这些参数可以在filter对象初始化的时候获取到;

MyFIlter1和MyFIlter2使用的注解方式定义的过滤器;

@Slf4j
@WebFilter(filterName = "myFilter1", urlPatterns = "/*", initParams = {@WebInitParam(name = "creator", value = "fanfu")})
public class MyFilter1 implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("//myFilter1初始化开始");
        String creator = filterConfig.getInitParameter("creator");
        log.info("//初始化参数creator:{}",creator);
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("//myFilter1开始执行");
        chain.doFilter(request, response);
        log.info("//myFilter1结束执行");
    }
 
    @Override
    public void destroy() {
        log.info("//myfilter1被销毁");
    }
}
@Slf4j
@WebFilter(filterName = "myFilter2", urlPatterns = "/*")
public class MyFilter2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("//myFilter2初始化开始");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("//myFilter2开始执行");
        chain.doFilter(request, response);
        log.info("//myFilter2结束执行");
    }
 
    @Override
    public void destroy() {
        log.info("//myFilter2被销毁");
    }
}

2、FilterRegistrationBean方式

在Springboot项目的配置类中,使用FilterRegistrationBean来包装自定义的过滤器,这种方式的最大好处就是可以自定义过滤器的执行顺序,数字越小,执行时的优先级就越高;

MyFIlter3和MyFIlter4是使用FilterRegistrationBean方式定义的过滤器;

@Configuration
public class WebConfig {
 
    @Bean
    public FilterRegistrationBean filterRegistration1() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter3());
        filterRegistrationBean.addUrlPatterns("/*");//定义过滤器对哪些请求路径进行过滤,/*表示对所有请求都过滤
        filterRegistrationBean.setOrder(2);//定义过滤器的执行优先级,数据越小优先级越高
        return filterRegistrationBean;
    }
 
    @Bean
    public FilterRegistrationBean filterRegistration2() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter4());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
}
@Slf4j
public class MyFilter3 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    log.info("//MyFilter3初始化开始");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("//MyFilter3开始执行");
        chain.doFilter(request,response);
        log.info("//MyFilter3结束执行");
    }
 
    @Override
    public void destroy() {
        log.info("//MyFilter3被销毁");
    }
}
@Slf4j
public class MyFilter4 implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("//MyFilter4初始化开始");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("//MyFilter4开始执行");
        chain.doFilter(request,response);
        log.info("//MyFilter4结束执行");
    }
 
    @Override
    public void destroy() {
        log.info("//MyFilter4被销毁");
    }
}

未定义myFilter3、myFilter4的执行优先级,即采取自然排序时的执行结果:在请求前myFilter3的执行时机早于myFilter4,响应后myFilter3的执行时机要晚于myFilter4;

定义myFilter4的优先级高于myFilter3时,执行结果:在请求前myFilter4的执行时机早于myFilter3,响应后的myFilter4的执行时机要晚于myFilter3;

总结

1、过滤器是用于SpringMVC项目中,即与servlet相关的项目;

2、过滤器的执行时机是在请求前和响应后,有两种实现方式,即@WebFilter注解和FilterRegistrationBean;如果对过滤器的执行顺序没有限制要求,则可以使用第一种;如果对过滤器的执行顺序有明确限制,则可以使用第二种;

3、如果有多个过滤器对象时,会形成一个过滤器链,过滤器的执行顺序是先进后出;

4、过滤器可以过滤请求和拦截响应,但是不能改变请求值和响应值;

标签:info,功能,log,void,Filter,过滤器,public,Springboot
From: https://www.cnblogs.com/henuyuxiang/p/17881789.html

相关文章

  • springboot监听器&拦截器【转】
    1.监听器https://www.cnblogs.com/elnimo/p/15641367.htmlCommandLineRunnerhttps://blog.csdn.net/qq_34531925/article/details/82527066https://www.cnblogs.com/yanxiaoguo/p/16167221.html2.拦截器https://blog.csdn.net/qq_50652600/article/details/127250413......
  • 中大型企业选择CRM系统,这些功能要注意
    中大型企业客户数量多,业务复杂,需求多样,对CRM系统有着更高的要求。因此中大型企业在进行CRM选型时,有几个核心功能是一定要具备的。下面说说,中大型企业选择CRM系统必备功能是什么?1、客户信息管理CRM系统可以帮助企业收集、存储、分析客户的基本信息,以及客户的购买历史,偏好,反馈等......
  • CRM客户管理系统的主要功能都有哪些
     我们都知道,CRM系统可以帮助企业加快业务增长。如果一个企业能提高业务效率、跨团队协作、有效管理客户、轻松共享和同步数据,那么企业竞争力将极大地提高。基于此,我们说说CRM客户关系管理系统的主要功能分析。完整的CRM是什么样的?完整的CRM系统应能实现营销、销售、服务等业......
  • ASIC 功能验证SVTB
    SystemVerilog进行验证是可以不综合的发现DUT中的功能问题预备知识:Linux/verilog/gvimSystemVerilog学习目录SystemVerilogTestbench功能DUT-待测试对象,RTL代码产生激励(generate)驱动激励(driver)采样响应(monitor)检查响应的正确性冗余代码:中间变量不使用......
  • Spring Boot学习随笔-SpringBoot的引言,回顾传统SSM开发
    学习视频:【编程不良人】2021年SpringBoot最新最全教程第一章、传统SSM开发回顾以及问题Spring+SpringMVC+MybatisSSM实现一个简单功能员工添加、查询…SSM项目简单实现项目需求分析—>概要设计—>(库表设计)—>详细设计—>(验证库表正确性)—>编码(环境搭建+......
  • 修订功能
    一、当别人发我们一篇文档时,我们可以在word中像老师批改学生作业那样进行修改,而且又不影响源文件在审阅---修订,启用修订功能后,就可以在word中进行修改,删除操作,并进行标记,如下:审阅---所有标记: 审阅--简单标记: 审阅--无标记或原文件,二、当别人修改了后文档,我们不一定全部......
  • SpringBoot高级开发(8)SpringBoot使用Lettuce设置多个RedisTemplate实例
    copy from:https://xiaomozhang.github.io/2021/02/07/spring-boot-lettuce-multi-instance/项目pom配置使用SpringBoot集成Redis,只需要将spring-boot-starter-data-redis和commons-pool2加到依赖即可 xml<dependency><groupId>org.springframework.boot</groupId>......
  • 有带AI功能的cms建站系统推荐吗?
    当涉及到带有AI功能的CMS建站系统时,以下是几个流行的选择:Wix:Wix是一个易于使用的网站建设平台,它提供了人工智能设计功能(WixADI),可以根据用户的需求和偏好自动创建网站设计。用户可以回答一些问题,然后WixADI将为他们生成一个定制的网站设计。Squarespace:Squarespace也是一个受......
  • 【SpringBootWeb入门-6】请求响应-请求参数-数组集合参数&Json参数&路径参数
    这篇我们接着上一篇的请求参数来讲解另外几个常见参数的接收以及封装:数组集合参数、Json参数、路径参数。数组集合参数1、数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数在Postman接口测试新建测试,获取请求数组参数type。然后新建参数处......
  • SpringBoot集成Jasypt实现数据加密
    1、环境说明JDK1.8+SpringBoot2.7 2、添加pom依赖<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency> 3......