Webflux过滤器跳转验证app_key有效,直接运行下一个过滤器

时间:2018-09-29 11:45:45

标签: project-reactor

我要验证app_key是否有效,app_key存储在redis中。当redis连接超时,然后在ex阶段运行。但是当redis connect正常时,验证阶段未运行,它直接运行下一个过滤器。我该怎么办?干嘛?

@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;
}
}

0 个答案:

没有答案