Программисты JAVA общаются здесь
Anonymous
Возвращает ответ напрямую без объединения фильтров в Spring WebFlux.
Сообщение
Anonymous » 09 янв 2025, 14:05
Я пытаюсь вернуть ответ в моем шлюзе в зависимости от значений, если они найдены в Redis, не затрагивая контроллер, но он всегда попадает в контроллер, и при возврате NettyRoutingFilter пытается удалить заголовок, а затем выдает UnsupportedOperationException поскольку ответ уже зафиксирован
Код: Выделить всё
@Override
public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String api = apis.keySet().stream()
.filter(e -> request.getURI().getPath().endsWith(e))
.findFirst()
.orElse(null);
if (api == null) {
return chain.filter(exchange);
}
return ReactiveSecurityContextHolder.getContext()
.flatMap(sc -> {
try {
Authentication authentication = sc.getAuthentication();
if (authentication == null || authentication.getPrincipal() == null) {
return chain.filter(exchange);
}
Set urlKey = generateCacheKey(request, apis.get(api));
List cachedResponse = redisTemplate.opsForValue().multiGet(urlKey);
if (cachedResponse != null && !cachedResponse.isEmpty()) {
return writeCachedResponse(response, cachedResponse.get(0).toString());
} else {
return chain.filter(exchange);
}
} catch (Exception e) {
return Mono.error(e);
}
})
.switchIfEmpty(Mono.defer(() -> {
return chain.filter(exchange);
}))
.doOnError(e -> log.error("Error during filter execution", e));
}
private Set generateCacheKey(ServerHttpRequest request, String cacheKey) {
return redisTemplate.keys("*" + cacheKey + "*");
}
private Mono writeCachedResponse(ServerHttpResponse response, String cachedResponse) {
return response.writeWith(Mono.just(response.bufferFactory().wrap(cachedResponse.getBytes())));
}
ожидает завершения цепочки и возвращает ответ напрямую
Подробнее здесь:
https://stackoverflow.com/questions/793 ... ng-webflux
1736420705
Anonymous
Я пытаюсь вернуть ответ в моем шлюзе в зависимости от значений, если они найдены в Redis, не затрагивая контроллер, но он всегда попадает в контроллер, и при возврате NettyRoutingFilter пытается удалить заголовок, а затем выдает UnsupportedOperationException поскольку ответ уже зафиксирован [code]@Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); String api = apis.keySet().stream() .filter(e -> request.getURI().getPath().endsWith(e)) .findFirst() .orElse(null); if (api == null) { return chain.filter(exchange); } return ReactiveSecurityContextHolder.getContext() .flatMap(sc -> { try { Authentication authentication = sc.getAuthentication(); if (authentication == null || authentication.getPrincipal() == null) { return chain.filter(exchange); } Set urlKey = generateCacheKey(request, apis.get(api)); List cachedResponse = redisTemplate.opsForValue().multiGet(urlKey); if (cachedResponse != null && !cachedResponse.isEmpty()) { return writeCachedResponse(response, cachedResponse.get(0).toString()); } else { return chain.filter(exchange); } } catch (Exception e) { return Mono.error(e); } }) .switchIfEmpty(Mono.defer(() -> { return chain.filter(exchange); })) .doOnError(e -> log.error("Error during filter execution", e)); } private Set generateCacheKey(ServerHttpRequest request, String cacheKey) { return redisTemplate.keys("*" + cacheKey + "*"); } private Mono writeCachedResponse(ServerHttpResponse response, String cachedResponse) { return response.writeWith(Mono.just(response.bufferFactory().wrap(cachedResponse.getBytes()))); } [/code] ожидает завершения цепочки и возвращает ответ напрямую Подробнее здесь: [url]https://stackoverflow.com/questions/79341819/returns-the-response-directly-without-chaining-filters-in-spring-webflux[/url]