Spring Boot - filter 的顺序

定义过滤器的执行顺序

1、第一个过滤器

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class MyFirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化逻辑
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("执行 MyFirstFilter...");

        // 继续执行过滤器链
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 清理逻辑
    }
}

第二个过滤器

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class MySecondFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化逻辑,如果需要的话
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 你的自定义过滤器逻辑在这里
        System.out.println("执行 MySecondFilter...");

        // 继续执行过滤器链
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 清理逻辑,如果需要的话
    }
}

定义过滤器的执行顺序的配置

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

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<MyFirstFilter> myFirstFilter() {
        FilterRegistrationBean<MyFirstFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MyFirstFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setOrder(1);
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean<MySecondFilter> mySecondFilter() {
        FilterRegistrationBean<MySecondFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MySecondFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setOrder(2);
        return registrationBean;
    }
}

定义controller

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello filter!";
    }
}

正常访问:http://localhost:8080/hello
在这里插入图片描述
不正常访问:http://localhost:8080/HELLO
在这里插入图片描述
在这里插入图片描述
可看到路径mapping是区分大小写的,如果路径不正确,虽然404,但过滤器链依然会执行(/*全局情况下)。

猜你喜欢

转载自blog.csdn.net/qq_43116031/article/details/134477035