006-spring cloud alibaba之gateway网关-过滤器Filter

gateway过滤器

过滤器作用在路由内部,体现在配置上就是Filter配置在routes下面。比如

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user
          uri: lb://user
          predicates:
            - Path=/cjxz/**
            - After=2026-01-10T21:40:10.529+08:00[Asia/Shanghai]
          filters:
            - StripPrefix=1 # 去掉第一个路径:/cjxz/

上面的filters就是一个过滤器。过滤器的作用就是允许修改传入HTTP请求或者传出HTTP响应。大白话就是filters可以修改http的入参,也可以修改http出参。gateway自带很多过滤器。比如上面使用StripPrefix就是其中一个,作用就是去掉路径中的第一个参数。下面举几个自带的过滤器使用。更多的过滤器可以去官网阅读一下,了解大概有哪些过滤器。在实际应用中遇到在去学习也可以。

RequestSize请求大小的过滤器

RequestSize的配置

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user
          uri: lb://user
          predicates:
            - Path=/cjxz/**
            - After=2026-01-10T21:40:10.529+08:00[Asia/Shanghai]
          filters:
            - StripPrefix=1 # 去掉第一个路径:/cjxz/
            - name: RequestSize
              args:
                maxSize:5000

测试方法

less 复制代码
@PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "请选择要上传的文件";
        }

        try {
            // 创建上传目录(如果不存在)
            Path uploadPath = Paths.get(UPLOAD_DIR);
            if (!Files.exists(uploadPath)) {
                Files.createDirectories(uploadPath);
            }

            // 生成唯一文件名,防止覆盖
            String originalFilename = file.getOriginalFilename();
            String fileExtension = "";
            if (originalFilename != null && originalFilename.contains(".")) {
                fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            String uniqueFilename = UUID.randomUUID().toString() + fileExtension;

            // 保存文件
            Path filePath = uploadPath.resolve(uniqueFilename);
            Files.copy(file.getInputStream(), filePath);

            return String.format("文件上传成功!\n" +
                            "原始文件名:%s\n" +
                            "保存文件名:%s\n" +
                            "文件大小:%d bytes\n" +
                            "保存路径:%s",
                    originalFilename,
                    uniqueFilename,
                    file.getSize(),
                    filePath.toAbsolutePath().toString());

        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传失败:" + e.getMessage();
        }
    }

测试

调用接口,上传一个较大的文件提示错误

vbscript 复制代码
413Payload Too Large请求体过大
请求内容过大,服务器无法处理
Request size is larger than permissible limit. Request size is 13.5 MB where permissible limit is 5.0 kB

AddRequestHeader过滤器

使用配置

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user
          uri: lb://user
          predicates:
            - Path=/cjxz/**
            - After=2026-01-10T21:40:10.529+08:00[Asia/Shanghai]
          filters:
            - StripPrefix=1 # 去掉第一个路径:/cjxz/
            - name: RequestSize
              args:
                maxSize:5000
            - AddRequestHeader=X-Request-red, blue

请求localhost:9999/cjxz/hello转发到user服务中,会增加RequestHeader参数:X-Request-red=blue

自定义过滤器

自定义过滤器需要实现GlobalFilterOrdered。下面是自定义过滤器的例子

java 复制代码
@Component
public class MyFilter implements GlobalFilter, Ordered {
    // 拦截器执行顺序,返回的int越小,在拦截器链路中越靠前
    @Override
    public int getOrder() {
        return 0;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("进入过滤器..");
        String userName = exchange.getRequest().getQueryParams().getFirst("userName");
        if(StringUtils.hasLength(userName)){
            return chain.filter(exchange);
        }
        // 没有userName直接结束
        System.out.println("非法请求...");
        exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
        return exchange.getResponse().setComplete();
    }
}

验证结果。访问:localhost:9999/cjxz/hello,不携带参数。

复制代码
406Not Acceptable不可接受
服务器在进行"服务器驱动的内容协商"后,找不到任何相关内容

带参数访问

css 复制代码
curl --location --request GET 'localhost:9999/cjxz/hello?userName=112' \
--header 'reqId: 8786768786767878'

响应结果

复制代码
hello xxx ...9002
相关推荐
蝎子莱莱爱打怪4 小时前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
SamDeepThinking1 天前
Java微服务练习方式
java·后端·微服务
米丘4 天前
微前端之 Web Components 完全指南
微服务·html
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
霸道流氓气质7 天前
Spring Boot 微服务性能优化完全指南
spring boot·微服务·性能优化
地瓜伯伯7 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
Devin~Y7 天前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频
递归尽头是星辰7 天前
AI 访问数据仓库:从直连到微服务化
数据仓库·人工智能·微服务·dataagent·ai数据治理
就改了8 天前
Windows 环境 SkyWalking 完整实操教程
windows·微服务·skywalking
至乐活着8 天前
Docker Compose多服务编排实战:从零搭建Node.js+MySQL+Redis全栈应用
docker·微服务·devops·容器编排·compose