From 04b138d3836e03c9adbcbd367fd71d92905c5206 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期四, 17 四月 2025 13:17:45 +0800
Subject: [PATCH] add: 重复登录处理

---
 app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt |   45 ++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt b/app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt
index 1c73d50..dcc4a2f 100644
--- a/app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt
+++ b/app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt
@@ -1,19 +1,54 @@
 package com.example.firstapp.network
 
+import android.content.Context
+import android.content.Intent
+import android.widget.Toast
+import com.example.firstapp.activity.LoginActivity
 import com.example.firstapp.utils.PreferencesManager
 import okhttp3.Interceptor
 import okhttp3.Response
+import kotlin.concurrent.thread
 
-class TokenExpiredInterceptor : Interceptor {
+class TokenExpiredInterceptor(private val context: Context) : Interceptor {
     override fun intercept(chain: Interceptor.Chain): Response {
         val response = chain.proceed(chain.request())
         
-        // 如果返回401,说明token可能过期
-        if (response.code == 401) {
-            PreferencesManager.clearUserData() // 清除本地token
-            // TODO: 处理token过期,例如跳转到登录页面
+        // 如果返回401或后端自定义的token失效状态码,说明token可能过期
+        if (response.code == 401 || isTokenInvalid(response)) {
+            // 清除本地token
+            PreferencesManager.clearUserData()
+            
+            // 在主线程中显示提示并跳转到登录页面
+            thread {
+                android.os.Handler(context.mainLooper).post {
+                    Toast.makeText(context, "登录已失效,请重新登录", Toast.LENGTH_LONG).show()
+                    
+                    // 创建跳转到登录页面的Intent,并添加清除任务栈的标志
+                    val intent = Intent(context, LoginActivity::class.java).apply {
+                        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+                    }
+                    context.startActivity(intent)
+                }
+            }
         }
         
         return response
     }
+    
+    // 检查响应是否表示token失效
+    private fun isTokenInvalid(response: Response): Boolean {
+        try {
+            // 尝试读取响应体,检查自定义的错误码
+            // 注意:这会消耗响应体,如果需要在后续处理中使用响应体,需要克隆
+            val responseBody = response.peekBody(4096).string()
+            
+            // 根据您的后端逻辑,检查是否包含token失效的提示
+            // 这里假设后端在返回JSON中包含了错误码和消息
+            return responseBody.contains("\"code\":\"401\"") || 
+                   responseBody.contains("token失效") ||
+                   responseBody.contains("请重新登录")
+        } catch (e: Exception) {
+            return false
+        }
+    }
 } 
\ No newline at end of file

--
Gitblit v1.9.3