spring-cloud - route.uri 字段的文件方案
问题描述
像这样:
spring:
cloud:
gateway:
routes:
- id: static-file
uri: file:///data/pub/
predicates:
- Path=/file/**
它支持吗?
我想以ResourceHandlerRegistry.addResourceHandler
这种方式替换。
解决方案
我的实现是这样的:
@Component
public class GlobalFileRoutingFilter implements GlobalFilter, Ordered {
private static final Log log = LogFactory.getLog(GlobalFileRoutingFilter.class);
private final DispatcherHandler dispatcherHandler;
public GlobalFileRoutingFilter(DispatcherHandler dispatcherHandler) {
this.dispatcherHandler = dispatcherHandler;
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Route route = (Route)exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
if (route == null) {
return chain.filter(exchange);
} else {
log.trace("GlobalFileRoutingFilter start");
URI routeUri = route.getUri();
String scheme = routeUri.getScheme();
if (isAlreadyRouted(exchange) || !"file".equals(scheme)) {
return chain.filter(exchange);
}
setAlreadyRouted(exchange);
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String filePath = routeUri.getPath() + File.separator + request.getURI().getPath();
if (log.isTraceEnabled()) {
log.trace("Reading from file: "+filePath);
}
if ("HEAD".equalsIgnoreCase(request.getMethod().toString())) {
response.getHeaders().set(HttpHeaders.ACCEPT_RANGES, "none");
} else {
File file = new File(filePath);
if (!file.exists()) {
response.setStatusCode(HttpStatus.NOT_FOUND);
} else {
DataBuffer dataBuffer = response.bufferFactory().allocateBuffer();
try {
dataBuffer.write(IOUtils.toByteArray(new FileInputStream(file)));
} catch (IOException e) {
if (log.isErrorEnabled()) {
log.error(e);
}
}
return response.writeAndFlushWith(Flux.just(Flux.just(dataBuffer)));
}
}
return Mono.empty();
}
}
}
推荐阅读
- docker - setpgid:在 Docker 上不允许操作
- r - 错误构建网页:RStudio + blogdown + Ezhil Theme
- javascript - 谁能告诉我,如何使用 Java 脚本代码将下面的 html 下拉值保存到表中
- python - Python递归搜索(文本)文件并执行用户ID删除
- c# - 使用自定义比特率在 ASP.NET MVC 中将字节作为音频播放
- apache-spark - Spark 3.1.1 在 generated.java 文件中抛出编译错误
- django - 如何在 1:m 关系中设置默认值,Django 中 user_auth_model 的外键
- bash - pash 中 for 循环的不正确规范(错字?)
- azure - 如何获得 azure 订阅的限制?
- c++ - C++中引用变量的使用