java - 更新 Flux WebClient 中的授权 header

标签 java spring spring-webflux server-sent-events

我正在尝试在响应式(Reactive)编程中创建一个有弹性的 sse(服务器发送事件)客户端。 sse 端点经过身份验证,因此我必须为每个请求添加授权 header 。

授权 token 将在 1 小时后过期。

下面是我的代码片段

        webClient.get()
                .uri("/events")
                .headers(httpHeaders -> httpHeaders.setBearerAuth(authService.getIdToken()))
                .retrieve()
                .bodyToFlux(ServerSideEvent.class)
                .timeout(Duration.ofSeconds(TIMEOUT))
                .retryWhen(Retry.fixedDelay(Long.MAX_VALUE, Duration.ofSeconds(RETRY_DELAY)))
                .subscribe(
                        content -> {
                            handleEvent(content);
                        },
                        error -> logger.error("Error receiving SSE: {}", error),
                        () -> logger.info("Completed!!!"));

如果 1 小时后由于任何原因失去连接,此代码将停止工作,因为 token 已过期。

如何将 token 刷新到重试逻辑中或以其他方式刷新? 谢谢

最佳答案

您可以使用网络客户端过滤器。

过滤器可以拦截和修改客户端请求和响应。 示例:

WebClient.builder().filter((request, next) -> {
    ClientRequest newReuqest = ClientRequest.from(request)
            .header("Authorization", "YOUR_TOKEN")
            .build();

    return next.exchange(newRequest);
}).build();

更新:

抱歉,没有看清楚您的问题。试试这个:

假设服务器在 token 过期时返回 401 代码。

WebClient.builder().filter((request, next) -> {
    final Mono<ClientResponse> response = next.exchange(request);
    return response.filter(clientResponse -> clientResponse.statusCode() != HttpStatus.UNAUTHORIZED)
            // handle 401 Unauthorized (token expired)
            .switchIfEmpty(next.exchange(ClientRequest.from(request)
                    .headers(httpHeaders -> httpHeaders.setBearerAuth(getNewToken()))
                    .build()));
}).build();

或者你可以缓存你的token(例如保存到redis并在一小时内设置TTL),当redis中的token为空时,获取新的然后再次保存到redis。

关于java - 更新 Flux WebClient 中的授权 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72540727/

相关文章:

java - Spring MVC - 不支持请求方法 "POST"

java - 20多分钟就开始Spring应用了。如何减少呢?

java - Spring react : convert Flux<Wrapper<X>> to Flux<X>

java - 如何使用jgit将现有存储库克隆到新的github实例?

java - 为什么 Spring 3.x 忽略 PropertyPlaceholderConfigurer 的某些占位符前缀?

java - Google Contacts API v3 Java Client Library 全文搜索不工作

java - 如何在 XML 配置中注入(inject) Autowired beans?

java - 如何拦截使用 WebClient/WebFlux 形成的所有传出 HTTP 请求?

java - block()/blockFirst()/blockLast() 在调用 bodyToMono AFTER exchange() 时出现阻塞错误

java - 在java中自动删除jRadioButton