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
相关推荐
爱看老照片3 小时前
Spring Cloud 微服务安全防护策略实现指南
微服务·springcloud·security·防护性策略实现·防护性技术选型
weixin_BYSJ198715 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
右耳朵猫AI1 天前
Go周刊2026W37 | Ebitengine 纯 Go 化、simd 重写 TurboPFor、json/v2 落地
后端·微服务·go
@PHARAOH1 天前
WHAT - 从前端组件化思维到后端架构设计入门
前端·微服务·架构
天天喝旺仔1 天前
深入理解 JWT:从 Token 结构、签名机制到前后端鉴权实战
redis·安全·spring·微服务·https
海宇AI2 天前
微服务架构实战:基于海宇对外投资历史查询服务构建自动化合规审计网关
人工智能·微服务·架构·自动化
Safeploy安策数据2 天前
密钥管理入门:从泄漏复盘看企业如何守住密钥安全底线
大数据·运维·微服务
谷哥的小弟2 天前
微服务开发版本适配说明
spring cloud·微服务
2601_962218473 天前
万象生鲜系统协议价底层架构实现生鲜企业报价业务数字化管理
大数据·运维·微服务·云原生·架构
QQ_21696290963 天前
基于微服务架构的店铺管理系统的设计与实现
大数据·spring boot·后端·spring·微服务·小程序·架构