javaws环境运行jakarta.ws.rs.client首次请求后不发新请求如何禁用缓存?
Jersey客户端javaws运行环境响应缓存问题解决方案
根因说明
javaws运行环境会默认开启JRE全局的HttpURLConnection缓存,Jersey默认使用的HTTP连接器基于HttpURLConnection实现,会直接继承该全局配置。缓存逻辑在HTTP请求发送前就会触发,因此即使手动设置Cache-Control请求头也不会生效,请求会直接被本地缓存拦截返回,不会产生实际网络流量。
可行解决方案
方案1:全局禁用URLConnection缓存(快速生效)
在客户端初始化代码的最开始添加系统属性配置,直接修改JRE全局的HTTP连接默认行为:
// 全局禁用HttpURLConnection默认缓存 System.setProperty("sun.net.client.defaultUseCaches", "false"); // 可选配置:如果同时存在连接复用导致的异常可以新增以下配置 System.setProperty("http.keepAlive", "false");
该方案配置最简单,适合应用内没有其他依赖HttpURLConnection缓存的场景。
方案2:定制Jersey连接器(无全局影响,推荐)
自定义Jersey的HttpUrlConnectorProvider,仅针对Jersey客户端的连接禁用缓存,不影响应用内其他HTTP连接逻辑:
import org.glassfish.jersey.client.HttpUrlConnectorProvider; import java.net.HttpURLConnection; // 自定义连接器工厂,强制禁用缓存 HttpUrlConnectorProvider connectorProvider = new HttpUrlConnectorProvider(); connectorProvider.connectionFactory(url -> { HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setUseCaches(false); return connection; }); // 构建Client时注册自定义连接器 this.client = ClientBuilder.newBuilder() .sslContext(sslContext) .hostnameVerifier(new TrustedHostnameVerifier()) .connectorProvider(connectorProvider) // 新增该行配置 .build(); client.register(GZipEncoder.class); client.register(EncodingFilter.class);
该方案仅作用于当前Jersey客户端实例,不会修改全局配置,适用所有场景。
方案3:追加随机请求参数(兜底方案)
如果以上方案都不生效,可以在每次发起请求时追加一个值为当前时间戳的查询参数,保证每次请求URL唯一,完全绕过所有缓存逻辑:
// 请求前追加随机时间戳参数 Response response = this.webTarget .queryParam("_t", System.currentTimeMillis()) .request() .get();
该方案不需要修改客户端初始化逻辑,适合临时快速验证或者服务端允许额外查询参数的场景。
内容的提问来源于stack exchange,提问作者PaulEdison
相关产品推荐
相关产品推荐

