Фильтр Webflux скачет, проверьте, что app_key действителен, прямо для запуска следующего фильтра - PullRequest
0 голосов
/ 29 сентября 2018

Я хочу убедиться, что ключ app_key действителен, ключ app_key хранится в redis.when тайм-аут подключения redis и запуск ex-фазы. Но когда redis connect нормальный, этап проверки не выполняется, он направляет на запуск следующего фильтра.do?

@Resource
private AppKeyProvider appKeyProvider;

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
try {
    String app_key =exchange.getRequest().getQueryParams().getFirst("app_key"));         
    //app_key verify
    Flux.just(app_key).flatMap(key -> appKeyProvider.getAppKey(key)).subscribe(
            appKey -> {                       
                if (appKey == null) {
                    //app_key is not valid
                    throw new AppException(ErrorCode.ILLEGAL_APP_KEY);
                }else{
                        //do... jump to next filter
                }
            },
            ex -> {
                throw new AppException(ErrorCode.SERVICE_BASIC_ERROR, ex);
            }
    );
} catch (AppException ex) {            
    exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
    exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
    String  result = RestHelper.build(ex, exchange).toString();                
    return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(result.getBytes(Charsets.UTF_8))));
}
return chain.filter(exchange);

}

AppKeyProvider.java

@Component
public class AppKeyProvider {

@Resource
private ReactiveRedisTemplate reactiveRedisTemplate;

private final static Logger logger = LoggerFactory.getLogger(AppKeyProvider.class);
private final static AppKeyProvider instance = new AppKeyProvider();
private static ConcurrentHashMap<String, Api> apiMap = new ConcurrentHashMap<String, Api>();
private final static Lock lock = new ReentrantLock(true);

/**
 * Get AppKey
 *
 * @param app_key
 * @return
 */
public Mono<AppKey> getAppKey(String app_key) {
    ReactiveValueOperations<String, AppKey> operations = reactiveRedisTemplate.opsForValue();
    Mono<AppKey> appKey = operations.get(RedisKeypPrefix.APP_KEY + app_key);
    return appKey;
}
}
...