You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dagger 2时JWT Token无法在运行时更新的问题求助

解决Dagger 2中运行时Token更新后Retrofit Authorization头未更新的问题

你的问题核心在于AuthInterceptor作为单例,初始化时只获取了一次Token快照,之后不会自动同步SharedPreferences中的更新值。因为Dagger的Singleton组件只会创建一次Interceptor实例,构造时传入的Token是固定值,后续SharedPreferences更新后,Interceptor里的Token不会自动刷新。

下面是具体的修复方案:

1. 改造AuthInterceptor,实时获取Token

不要在构造时传入固定的Token字符串,而是传入SharedPreferencesSources,让Interceptor每次拦截请求时都去读取最新的Token值:

class AuthInterceptor constructor(
    private val sharedPreferencesSources: SharedPreferencesSources
) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response = chain.run {
        // 每次请求时都获取最新的Token
        val latestToken = sharedPreferencesSources.tokenApi()
        
        proceed(
            request()
                .newBuilder()
                .addHeader("Accept", "application/json")
                .apply {
                    // 避免空Token导致的请求错误
                    if (latestToken.isNotBlank()) {
                        addHeader("Authorization", "Bearer $latestToken")
                    }
                }
                .build()
        )
    }
}

2. 调整Dagger Module的依赖提供

修改AppModule中提供AuthInterceptor的方法,不再传入Token,而是直接传入SharedPreferencesSources:

@Singleton
@Provides
fun provideAuthInterceptor(sharedPreferencesSources: SharedPreferencesSources): Interceptor {
    return AuthInterceptor(sharedPreferencesSources)
}

3. 确保SharedPreferencesSources实时读取Token

检查你的SharedPreferencesSourcesImpl实现,确保tokenApi()方法是每次都从SharedPreferences中读取,而不是缓存值:

class SharedPreferencesSourcesImpl(private val sharedPref: SharedPreferences) : SharedPreferencesSources {
    override fun tokenApi(): String {
        // 直接从SharedPreferences读取最新值,不要用变量缓存
        return sharedPref.getString("your_token_key", "") ?: ""
    }
}

为什么这个方案有效?

改造后的Interceptor不再依赖初始化时的Token快照,而是在每次处理网络请求时都实时从SharedPreferences获取最新Token。当你修改密码成功后更新了SharedPreferences中的Token,下一次网络请求就会自动使用新的Token,完全不需要重新构建Dagger组件或Retrofit实例。

如果你的业务场景需要更复杂的Token监听(比如Token过期自动刷新),可以考虑结合LiveData或Flow来观察Token变化,但对于当前的场景,实时读取已经是最简单高效的解决方案。

内容的提问来源于stack exchange,提问作者Anggit Prayogo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:42:44