GlobalFilter、Filter关系

维度 GlobalFilter Filter
技术体系 Spring Cloud Gateway + WebFlux Java Servlet API
编程模型 响应式 (Reactive) 阻塞式 (Imperative)
作用范围 全局(所有路由) 可配置路径模式
执行效率 更高(基于事件循环) 较低(线程池模型)
配置方式 Spring Bean 自动注册 web.xml 或 @WebFilter

如何选择?

  • 如果你正在开发 API 网关 或 微服务入口,使用 GlobalFilter

  • 如果你维护 传统 Spring MVC 或 War 包部署的应用,使用 Filter

  • 需要 非阻塞高并发 时选 GlobalFilter,需要 兼容旧系统 时选 Filter

1. 基础全局过滤器实现

功能:为所有请求添加固定请求头 + 记录请求日志
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class SimpleGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1. 预处理 (Pre-Filter)
        ServerHttpRequest modifiedRequest = exchange.getRequest()
            .mutate()
            .header("X-Global-Filter", "processed") // 添加固定请求头
            .build();

        System.out.println("Global Filter - Request Path: " + exchange.getRequest().getPath());

        // 2. 传递修改后的请求
        return chain.filter(exchange.mutate().request(modifiedRequest).build())
            // 3. 后处理 (Post-Filter)
            .then(Mono.fromRunnable(() -> {
                System.out.println("Global Filter - Response Status: " 
                    + exchange.getResponse().getStatusCode());
            }));
    }

    @Override
    public int getOrder() {
        return -1; // 执行顺序 (越小优先级越高)
    }
}

执行顺序控制

通过 Ordered 接口或 @Order 注解控制:

// 方式1:实现 Ordered 接口
@Override
public int getOrder() {
    return Ordered.HIGHEST_PRECEDENCE; // 最高优先级
}

// 方式2:使用 @Order 注解
@Order(-100) // 数字越小越先执行
public class MyFilter implements GlobalFilter {...}

2.传统的 Servlet Filter实现 

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

// 使用注解声明这是一个 Filter,并指定拦截路径
@WebFilter("/*") // 拦截所有请求
public class CoreFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        
        System.out.println("【Filter】请求进入: " + request.getRemoteAddr());
        
        // 放行请求
        chain.doFilter(request, response);
        
        System.out.println("【Filter】响应返回");
    }
}

. 确保主类开启 Filter 扫描

import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan // 这行是关键!
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

你可能感兴趣的:(java,java)