首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧云网关,请求大小限制过滤器是可用的。

弹簧云网关,请求大小限制过滤器是可用的。
EN

Stack Overflow用户
提问于 2018-06-11 16:37:37
回答 1查看 3.4K关注 0票数 2

我正在spring-cloud-gateway的一个项目中工作。我发现请求大小限制筛选器尚未可用。但我需要开发它。知道吗,它来了吗?或者我应该开始我自己的发展。

我知道这是很难得到任何答案,因为除了开发商,有少数人正在工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-14 05:31:32

我已经创建了一个名为RequestSizeGatewayFilterFactory的过滤器,到目前为止,它对我们的应用程序很好。但不确定这是否是spring-cloud-gateway项目的一部分。

代码语言:javascript
复制
package com.api.gateway.somename.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

/**
 * This filter blocks the request, if the request size is more than
 * the permissible size.The default request size is 5 MB
 *
 * @author Arpan
 */
public class RequestSizeGatewayFilterFactory
        extends AbstractGatewayFilterFactory<RequestSizeGatewayFilterFactory.RequestSizeConfig> {

    private static String PREFIX = "kMGTPE";
    private static String ERROR = "Request size is larger than permissible limit." +
            "Request size is %s where permissible limit is %s";

    public RequestSizeGatewayFilterFactory() {
        super(RequestSizeGatewayFilterFactory.RequestSizeConfig.class);
    }

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

    public static class RequestSizeConfig {

        // 5 MB is the default request size
        private Long maxSize = 5000000L;

        public RequestSizeGatewayFilterFactory.RequestSizeConfig setMaxSize(Long maxSize) {
            this.maxSize = maxSize;
            return this;
        }

        public Long getMaxSize() {
            return maxSize;
        }

        public void validate() {
            Assert.isTrue(this.maxSize != null && this.maxSize > 0,
                    "maxSize must be greater than 0");
            Assert.isInstanceOf(Long.class, maxSize, "maxSize must be a number");
        }
    }

    private static String getErrorMessage(Long currentRequestSize, Long maxSize) {
        return String.format(ERROR,
                getHumanReadableByteCount(currentRequestSize),
                getHumanReadableByteCount(maxSize));
    }

    private static String getHumanReadableByteCount(long bytes) {
        int unit = 1000;
        if (bytes < unit) return bytes + " B";
        int exp = (int) (Math.log(bytes) / Math.log(unit));
        String pre = Character.toString(PREFIX.charAt(exp - 1));
        return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
    }
}

过滤器的配置是:,当它作为默认筛选器工作时:

代码语言:javascript
复制
spring:
  application:
    name: somename
  cloud:
    gateway:
      default-filters:
      - Hystrix=default
      - RequestSize=7000000

当需要在某些API中应用时,

代码语言:javascript
复制
# ===========================================
  - id: request_size_route
    uri: ${test.uri}/upload
    predicates:
    - Path=/upload
    filters:
    - name: RequestSize
      args:
        maxSize: 5000000

此外,您还需要在项目中的某个组件可扫描类中配置bean,这是用于GatewayAutoConfiguration项目的spring-cloud-gateway-core

代码语言:javascript
复制
@Bean
public RequestSizeGatewayFilterFactory requestSizeGatewayFilterFactory() {
   return new RequestSizeGatewayFilterFactory();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50802394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档