Quarkus/MicroProfile Rest Client如何自动管理认证会话Cookie
方案一:启用内置Cookie存储(推荐,无侵入)
Quarkus Rest Client 原生提供了Cookie自动管理能力,只需简单配置即可实现Cookie的自动接收、存储、携带,完全不需要手动处理@CookieParam:
- 添加配置到
application.properties文件:# 全局启用所有Rest Client的Cookie自动管理 quarkus.rest-client.cookie-store.enabled=true # 如果仅需要为指定Rest Client启用,替换为你的Rest Client配置key即可 # quarkus.rest-client."你的服务配置key".cookie-store.enabled=true - 配置生效后,框架会自动维护内存级Cookie存储:
- 所有接口响应返回的
Set-Cookie头内容会自动存入存储 - 后续发往同域名的请求会自动携带匹配的Cookie
- 每次响应返回的新Cookie会自动更新存储中的旧值
- 所有接口响应返回的
注意:默认Rest Client是单例作用域,全应用共享同一份Cookie存储,适合服务间通信的场景;如果需要按请求隔离Cookie,可给Rest Client添加
@RequestScoped注解,每个请求会持有独立的Cookie存储。
方案二:自定义Cookie管理逻辑(适合特殊定制需求)
如果你需要对Cookie的存储、更新做自定义控制(比如持久化Cookie到外置存储、跨多个Rest Client共享Cookie等),可以通过自定义ClientHeadersFactory+响应过滤器实现:
- 实现自定义Cookie管理类
import org.eclipse.microprofile.rest.client.ext.ClientHeadersFactory; import javax.enterprise.context.ApplicationScoped; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; import java.util.List; @ApplicationScoped public class CustomCookieManager implements ClientHeadersFactory { // 线程安全的Cookie存储,可根据需求替换为Redis等持久化存储 private final MultivaluedMap<String, String> cookieStore = new MultivaluedHashMap<>(); @Override public MultivaluedMap<String, String> update(MultivaluedMap<String, String> incomingHeaders, MultivaluedMap<String, String> clientOutgoingHeaders) { MultivaluedMap<String, String> headers = new MultivaluedHashMap<>(); // 请求发出前自动把存储的Cookie加到请求头 if (!cookieStore.isEmpty()) { List<String> cookieList = cookieStore.entrySet().stream() .map(entry -> entry.getKey() + "=" + String.join(";", entry.getValue())) .toList(); headers.put("Cookie", cookieList); } return headers; } // 从响应头更新Cookie存储 public void syncCookiesFromResponse(MultivaluedMap<String, Object> responseHeaders) { List<Object> setCookies = responseHeaders.get("Set-Cookie"); if (setCookies == null || setCookies.isEmpty()) return; setCookies.forEach(rawCookie -> { String[] parts = rawCookie.toString().split("=", 2); if (parts.length == 2) { // 提取Cookie的键和值,自动过滤过期等属性 String value = parts[1].split(";", 2)[0]; cookieStore.putSingle(parts[0].trim(), value.trim()); } }); } } - 给你的Rest Client注册自定义Header工厂
import org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; @RegisterRestClient(configKey = "你的服务配置key") @RegisterClientHeaders(CustomCookieManager.class) public interface ExternalServiceClient { // 定义你的业务接口方法 } - (可选)实现响应过滤器自动同步Cookie,不需要手动调用更新方法
import javax.ws.rs.ext.Provider; import javax.ws.rs.client.ClientResponseContext; import javax.ws.rs.client.ClientResponseFilter; import java.io.IOException; @Provider public class CookieSyncFilter implements ClientResponseFilter { private final CustomCookieManager cookieManager; public CookieSyncFilter(CustomCookieManager cookieManager) { this.cookieManager = cookieManager; } @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { // 每次收到响应自动同步Cookie cookieManager.syncCookiesFromResponse(responseContext.getHeaders()); } }
内容的提问来源于stack exchange,提问作者KyriacosP
相关产品推荐
相关产品推荐

