Возвращает ответ напрямую без объединения фильтров в Spring WebFlux.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Возвращает ответ напрямую без объединения фильтров в Spring WebFlux.

Сообщение Anonymous »

Я пытаюсь вернуть ответ в моем шлюзе в зависимости от значений, если они найдены в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»