Springboot 2.3 使用FilterRegistrationBean自定义多个过滤器

1.创建第一个过滤器MyFilter

package com.iflytek.edu.config;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author yq
 * @create 2020-07-14-11:12
 **/
public class MyFilter implements Filter {

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

    @Override
    public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) srequest;
        //这边可以拿到配置类中过滤的url,然后进行处理,详细这边不再描述
        System.out.println("this is MyFilter,url :"+request.getRequestURI());
        
        //放行执行下一个过滤器
        filterChain.doFilter(srequest, sresponse);
    }

    @Override
    public void destroy() { }
}

2.创建第二个过滤器MyFilter2

package com.iflytek.edu.config;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author yq
 * @create 2020-07-14-11:12
 **/
public class MyFilter2 implements Filter {

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

    @Override
    public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) srequest;
        System.out.println("this is MyFilter2,url :"+request.getRequestURI());
        filterChain.doFilter(srequest, sresponse);
    }

    @Override
    public void destroy() { }
}

3.创建过滤器配置类

package com.iflytek.edu.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

/**
 * @author yq
 * @create 2020-07-14-11:16
 **/
@Configuration
public class WebConfiguration {
    //多个FilterRegistrationBean自定义过滤器,bean中的名字要不一样,不然会发生只会调用优先级最高的,优先级最低的不调用

    //@Bean("MyFilter") 相当于该方法中的setName()
    //@Order(6)目前不起作用
    @Bean
    public FilterRegistrationBean testFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new MyFilter());
        registration.addUrlPatterns("/test");//要过滤的路径
        registration.setName("MyFilter"); //过滤器的名字也是web容器中的实例对象名,也可以不写这行,可以在bean注解
        registration.setOrder(6);//多个过滤器的执行顺序,数字越小优先级越高
        return registration;
    }

    //@Bean("MyFilter2") 相当于该方法中的setName()
    //@Order(1)之前有看到过可以这样写,但是目前2.3测试运行编译不报错,但是不起作用
    @Bean
    public FilterRegistrationBean test2FilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new MyFilter2());
        registration.addUrlPatterns("/test");
        registration.setName("MyFilter2");
        registration.setOrder(1);
        return registration;
    }
}

4.测试发现过滤器MyFilter2比MyFilter先执行
运行控制台打印

this is MyFilter2,url :/test
this is MyFilter,url :/test

猜你喜欢

转载自blog.csdn.net/qq_40974235/article/details/107339619