美文网首页
springcloud gateway 限制文件上传大小

springcloud gateway 限制文件上传大小

作者: Always_July | 来源:发表于2022-01-19 11:01 被阅读0次

背景

公司使用springcloud gateway做为各个服务的入口,最近新接上传功能需求,需要限制文件上传的大小。

框架版本

    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-gateway-core</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

yml配置

所有请求

spring:
  cloud:
    gateway:
      enabled: true  #开启网关
      default-filters:
        - name: RequestSize
          args:
            maxSize: 1000000

某个请求

  - id: request_size_route
    uri: ${test.uri}/upload
    predicates:
    - Path=/upload
    filters:
    - name: RequestSize
      args:
        maxSize: 5000000

关键代码

org.springframework.cloud.gateway.filter.factory.RequestSizeGatewayFilterFactory

public GatewayFilter apply(
            RequestSizeGatewayFilterFactory.RequestSizeConfig requestSizeConfig) {
        requestSizeConfig.validate();
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange,
                    GatewayFilterChain chain) {
                ServerHttpRequest request = exchange.getRequest();
//1
                String contentLength = request.getHeaders().getFirst("content-length");
                if (!StringUtils.isEmpty(contentLength)) {
                    Long currentRequestSize = Long.valueOf(contentLength);
                    if (currentRequestSize > requestSizeConfig.getMaxSize().toBytes()) {
                        exchange.getResponse()
                                .setStatusCode(HttpStatus.PAYLOAD_TOO_LARGE);
                        if (!exchange.getResponse().isCommitted()) {
                            exchange.getResponse().getHeaders().add("errorMessage",
                                    getErrorMessage(currentRequestSize,
                                            requestSizeConfig.getMaxSize().toBytes()));
                        }
                        return exchange.getResponse().setComplete();
                    }
                }
                return chain.filter(exchange);
            }

            @Override
            public String toString() {
                return filterToStringCreator(RequestSizeGatewayFilterFactory.this)
                        .append("max", requestSizeConfig.getMaxSize()).toString();
            }
        };
    }

//1 处 根据请求头的content-length判断当前请求大小。

参考资料

Pull Request #376 · spring-cloud_spring-cloud-gateway

百度搜了很久没有合适的答案,最后去github springcloud仓库issue一搜就解决了问题,下次一定要先去github issue搜索。

相关文章

网友评论

      本文标题:springcloud gateway 限制文件上传大小

      本文链接:https://www.haomeiwen.com/subject/nslrhrtx.html