Token更新时如何实现应用自动登出?
解决思路与实现方案
1. 统一拦截401状态(含HTTP状态码与业务码)
不管后端是返回HTTP 401状态码,还是响应体里的code字段为401,都要触发登出逻辑。直接在postData方法的响应处理里同时检查这两个场景:
.then((response) { try { // 先检查HTTP层面的401 if (response.statusCode == 401) { Api.logout(); responseData = {'code': 401, 'message': 'Token失效'}; return; } responseData = json.decode(response.body); // 再检查业务返回的401码 if (responseData['code'] == 401) { Api.logout(); return; } // 保留正常更新token的逻辑 if (responseData.containsKey('token') && phoneNumber!.isNotEmpty) { authToken = responseData['token']; authPhoneNumber = phoneNumber; } } catch (error) { print('error ${response.statusCode}'); } });
2. 实现全局登出方法
在Api类里加一个静态登出方法,专门负责清空认证信息并跳转到登录页:
class Api { static String? authToken; static String authPhoneNumber = ''; // 全局登出逻辑 static void logout() { // 清空本地存储的token和用户信息 authToken = null; authPhoneNumber = ''; // 跳转到登录页(Flutter环境下需用全局导航键确保上下文可用) // 示例: // GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); // navigatorKey.currentState?.pushNamedAndRemoveUntil('/login', (route) => false); } // 原postData方法... }
3. 优化token更新逻辑
避免在错误场景下覆盖有效token,可限定只有特定接口(比如刷新token的接口)才更新authToken:
// 修改token更新条件,仅在刷新token接口返回时更新 if (urlHttp.contains('/refresh-token') && responseData.containsKey('token') && phoneNumber!.isNotEmpty) { authToken = responseData['token']; authPhoneNumber = phoneNumber; }
4. 封装全局错误处理(可选)
如果应用有大量API请求,把错误拦截逻辑抽成单独方法,减少重复代码:
static void handleResponseError(int statusCode, Map<String, dynamic>? responseData) { if (statusCode == 401 || (responseData != null && responseData['code'] == 401)) { logout(); } }
然后在postData的响应处理里直接调用:
.then((response) { try { responseData = json.decode(response.body); Api.handleResponseError(response.statusCode, responseData); // 其他业务逻辑... } catch (error) { print('error ${response.statusCode}'); } });
内容的提问来源于stack exchange,提问作者gdf
相关产品推荐
相关产品推荐

