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
相关推荐
m0_7400437313 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务
Gary董15 小时前
高并发的微服务架构如何设计
微服务·云原生·架构
像少年啦飞驰点、18 小时前
零基础入门 Spring Boot:从“Hello World”到可部署微服务的完整学习路径
java·spring boot·微服务·编程入门·后端开发
java干货18 小时前
微服务:把一个简单的问题,拆成 100 个网络问题
网络·微服务·架构
indexsunny19 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa
天才奇男子20 小时前
《深度解析HAProxy七层代理:原理、配置与最佳实践》
linux·运维·微服务·云原生
onkel in blog20 小时前
【Java】Gradle 多模块项目实战:Spring Boot 微服务搭建全流程
java·spring boot·微服务·gradle
七夜zippoe21 小时前
Kubernetes与Python微服务编排实战:从基础部署到自动扩缩容
python·微服务·kubernetes·service·hpa
小楼v21 小时前
使用Nacos实现动态IP黑名单过滤
java·后端·微服务·nacos
JavaLearnerZGQ21 小时前
Gateway网关将登录用户信息传递给下游微服务(完整实现方案)
微服务·架构·gateway