背景
公司使用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搜索。
网友评论