feat:增加 token 过期自动跳转登录的逻辑
This commit is contained in:
@@ -13,11 +13,11 @@ android {
|
||||
applicationId = "com.memory.app"
|
||||
minSdk = 26
|
||||
targetSdk = 35
|
||||
versionCode = 43
|
||||
versionName = "1.5.9"
|
||||
versionCode = 44
|
||||
versionName = "1.6.0"
|
||||
|
||||
buildConfigField("String", "API_BASE_URL", "\"https://x.amos.us.kg/api/\"")
|
||||
buildConfigField("int", "VERSION_CODE", "43")
|
||||
buildConfigField("int", "VERSION_CODE", "44")
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
|
||||
@@ -18,6 +18,7 @@ import com.memory.app.data.CredentialsManager
|
||||
import com.memory.app.data.ThemeManager
|
||||
import com.memory.app.data.ThemeMode
|
||||
import com.memory.app.data.UpdateManager
|
||||
import com.memory.app.data.api.ApiClient
|
||||
import com.memory.app.data.model.User
|
||||
import com.memory.app.data.model.VersionInfo
|
||||
import com.memory.app.data.repository.AuthRepository
|
||||
@@ -91,6 +92,20 @@ class MainActivity : ComponentActivity() {
|
||||
isLoggedIn = restored
|
||||
}
|
||||
|
||||
// 监听 401 事件,自动登出
|
||||
LaunchedEffect(Unit) {
|
||||
ApiClient.unauthorizedEvent.collect {
|
||||
authRepository.logout()
|
||||
isLoggedIn = false
|
||||
currentUser = null
|
||||
android.widget.Toast.makeText(
|
||||
this@MainActivity,
|
||||
"登录已过期,请重新登录",
|
||||
android.widget.Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
// Check for updates
|
||||
LaunchedEffect(Unit) {
|
||||
updateInfo = updateManager.checkUpdate()
|
||||
|
||||
@@ -2,6 +2,8 @@ package com.memory.app.data.api
|
||||
|
||||
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
|
||||
import com.memory.app.BuildConfig
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
import kotlinx.serialization.json.Json
|
||||
import okhttp3.MediaType.Companion.toMediaType
|
||||
import okhttp3.OkHttpClient
|
||||
@@ -12,6 +14,10 @@ import java.util.concurrent.TimeUnit
|
||||
object ApiClient {
|
||||
private var token: String? = null
|
||||
|
||||
// 401 事件流,用于通知 UI 层登出
|
||||
private val _unauthorizedEvent = MutableSharedFlow<Unit>(extraBufferCapacity = 1)
|
||||
val unauthorizedEvent = _unauthorizedEvent.asSharedFlow()
|
||||
|
||||
private val json = Json {
|
||||
ignoreUnknownKeys = true
|
||||
coerceInputValues = true
|
||||
@@ -27,7 +33,14 @@ object ApiClient {
|
||||
token?.let {
|
||||
request.addHeader("Authorization", "Bearer $it")
|
||||
}
|
||||
chain.proceed(request.build())
|
||||
val response = chain.proceed(request.build())
|
||||
|
||||
// 检测 401,触发登出事件
|
||||
if (response.code == 401) {
|
||||
_unauthorizedEvent.tryEmit(Unit)
|
||||
}
|
||||
|
||||
response
|
||||
}
|
||||
.addInterceptor(HttpLoggingInterceptor().apply {
|
||||
level = if (BuildConfig.DEBUG) {
|
||||
|
||||
Reference in New Issue
Block a user