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
相关推荐
像少年啦飞驰点、8 小时前
从零开始学 RabbitMQ:小白也能懂的消息队列实战指南
java·spring boot·微服务·消息队列·rabbitmq·异步编程
深圳行云创新9 小时前
微服务架构引入 AI 后,怎么统一研发和运维的标准规范?
人工智能·微服务·架构
是阿楷啊9 小时前
Java大厂面试场景:音视频场景中的Spring Boot与微服务实战
spring boot·redis·spring cloud·微服务·grafana·prometheus·java面试
天才奇男子18 小时前
HAProxy高级功能全解析
linux·运维·服务器·微服务·云原生
凯子坚持 c1 天前
C++基于微服务脚手架的视频点播系统---客户端(4)
数据库·c++·微服务
老百姓懂点AI1 天前
[微服务] Istio流量治理:智能体来了(西南总部)AI调度官的熔断策略与AI agent指挥官的混沌工程
人工智能·微服务·istio
JZC_xiaozhong1 天前
多系统权限标准不统一?企业如何实现跨平台统一权限管控
java·大数据·微服务·数据集成与应用集成·iam系统·权限治理·统一权限管理
岁岁种桃花儿1 天前
SpringCloud从入门到上天:Nacos做微服务注册中心
java·spring cloud·微服务
天远云服1 天前
天远车辆过户查询API微服务实战:用Go语言构建高性能车况溯源系统
大数据·微服务·架构·golang
瑶山1 天前
Spring Cloud微服务搭建三、分布式任务调度XXL-JOB
java·spring cloud·微服务·xxljob