spring boot2.1.1自定义Filter的两种方式

环境

idea 2019
jdk1.8
maven3.6
spring boot2.1.1(目前springboot最高版本为2.1.8情况下,2.0以上测试过几个版本都可正常运行)
项目类型:jar

导入spring boot web启动器依赖

<dependency>
 		<groupId>org.springframework.bootgroupId>
  	    <artifactId>spring-boot-starter-webartifactId>
dependency>

注意:spring boot自动配置的前提是>>所有组件都在核心启动类所在包及其子包下,所以本篇所有java类都是在核心类所在包及其子包下创建。

方式一(自动扫描)

创建一个类实现Filter接口,在类上加@WebFilter注解
package com.wn.demo.springboot.server;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/servlet")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("hello Filter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("Filter destory...");
    }
}
在配置类上添加@ServletComponentScan注解,这里方便起见就加在核心启动类上
package com.wn.demo.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan // 自动扫描自定义的Filter组件
@SpringBootApplication
public class SpringBootWeb2Application {

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

}

方式二(手动注册)推荐

创建一个类实现Filter接口
package com.wn.demo.springbootrestfulcrud.server;

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

public class MyFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("hello MyFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("Filter destory...");
    }
}
在配置类中注册Filter
package com.wn.demo.springbootrestfulcrud.config;

import com.wn.demo.springbootrestfulcrud.server.MyFilter;
import com.wn.demo.springbootrestfulcrud.server.MyListener;
import com.wn.demo.springbootrestfulcrud.server.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

/**
 * server相关配置
 */
@Configuration
public class MyServerConfig {
    /**
     * 注册filter
     * @return Filter注册对象
     */
    @Bean
    public FilterRegistrationBean<MyFilter> myFilter() {
        // 创建Filter注册对象
        FilterRegistrationBean<MyFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        // 设置Filter
        filterRegistrationBean.setFilter(new MyFilter());
        // 设置过滤路径
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/myServlet"));
        // 设置访问顺序
        filterRegistrationBean.setOrder(5);
        return filterRegistrationBean;
    }

}

总结

自动扫描的方式不能指定Filter过滤的先后顺序,只能按默认的类名的自然排序方式排序,即AFilter和BFilter中先执行AFilter。
手动注册的方式可以通过setOrder方法指定过滤顺序,参数小的先执行。

你可能感兴趣的:(spring boot2.1.1自定义Filter的两种方式)