咨询OKHttp 301重定向条目的存储位置及清除方法
关于OKHttp 301重定向缓存的位置与清除方法
嘿,我来帮你理清OKHttp处理301永久重定向的逻辑,解决你的困惑:
301重定向的缓存位置:
当你没有为OkHttpClient配置磁盘缓存(也就是没调用newBuilder().cache(new Cache(...)))时,OKHttp会把301的永久重定向条目存在内存缓存里,而且这个缓存是和你的OkHttpClient实例绑定的——它不会写入App的/data/data/<包名>/cache目录,也不会存储在系统级缓存中。这就是你在磁盘上找不到相关文件的原因。这个内存缓存的生命周期和
OkHttpClient实例一致,只要实例还在内存中,重定向记录就会保留;一旦实例被GC回收,缓存也会随之消失。如何清除这个301缓存:
- 最直接的方式:重建OkHttpClient实例
如果你可以重新创建OkHttpClient对象,直接new一个新的实例即可。旧实例被回收后,内存里的301重定向缓存就会被清除。 - 针对单个请求跳过缓存
如果你不想重建客户端,可以在发起请求时设置CacheControl.FORCE_NETWORK,强制OKHttp忽略所有缓存(包括内存中的301重定向),直接请求原地址:Request request = new Request.Builder() .url("你的原请求URL") .cacheControl(CacheControl.FORCE_NETWORK) .build(); - 禁止自动跟随重定向(临时排查用)
你也可以创建一个临时的OkHttpClient实例,关闭自动重定向,手动处理请求:OkHttpClient tempClient = originalClient.newBuilder() .followRedirects(false) .build();
- 最直接的方式:重建OkHttpClient实例
需要注意的是:OKHttp的内部内存缓存没有暴露直接清除的API,所以重建实例或者针对请求设置强制网络是最可靠的方案。
内容的提问来源于stack exchange,提问作者Andrew Kurniadi
相关产品推荐
相关产品推荐

