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

如何在Flutter应用中保存Flask后端的登录会话?

在Flutter中实现Flask登录会话持久化的方案

Flask默认通过Session Cookie维护登录状态,浏览器/Postman会自动处理Cookie的存储和携带,但Flutter需要手动或借助工具实现这一逻辑,以下是两种可行方案:

方案一:用http包手动管理Cookie

这种方式需要手动捕获登录响应中的Cookie并存储,后续请求时再将Cookie添加到请求头。

1. 登录时保存Cookie

import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';

Future<void> login(String username, String password) async {
  final response = await http.post(
    Uri.parse('http://你的FlaskAPI地址/login'),
    body: {'username': username, 'password': password},
  );

  if (response.statusCode == 200) {
    // 提取响应中的Set-Cookie头
    final cookie = response.headers['set-cookie'];
    if (cookie != null) {
      // 将Cookie持久化到本地SharedPreferences
      final prefs = await SharedPreferences.getInstance();
      await prefs.setString('session_cookie', cookie);
    }
  }
}

2. 后续请求携带Cookie

Future<void> fetchOrCreateData() async {
  final prefs = await SharedPreferences.getInstance();
  final savedCookie = prefs.getString('session_cookie');

  final response = await http.post(
    Uri.parse('http://你的FlaskAPI地址/create-data'),
    headers: {
      // 若存在保存的Cookie,添加到请求头
      if (savedCookie != null) 'Cookie': savedCookie,
    },
    body: {'key': 'value'}, // 你的请求数据
  );

  if (response.statusCode == 200) {
    // 处理接口返回结果
  }
}

方案二:用dio包自动管理Cookie(推荐)

Dio配合dio_cookie_manager插件可以自动完成Cookie的存储和携带,完全模拟浏览器的会话行为,无需手动处理。

1. 依赖配置

在pubspec.yaml中添加依赖:

dependencies:
  dio: ^5.0.0
  dio_cookie_manager: ^2.0.0
  cookie_jar: ^4.0.0

2. 初始化Dio和Cookie持久化

import 'package:dio/dio.dart';
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import 'package:cookie_jar/cookie_jar.dart';

// 全局Dio实例
final dio = Dio();
// 持久化CookieJar,会将Cookie保存到本地文件
final cookieJar = PersistCookieJar(storage: FileStorage('flutter_cookies'));

void initDio() {
  // 给Dio添加Cookie管理拦截器
  dio.interceptors.add(CookieManager(cookieJar));
}

3. 登录与后续请求

// 登录请求,自动保存Cookie
Future<void> login(String username, String password) async {
  await dio.post(
    'http://你的FlaskAPI地址/login',
    data: {'username': username, 'password': password},
  );
}

// 创建数据请求,自动携带Cookie
Future<void> createData(Map<String, dynamic> data) async {
  final response = await dio.post(
    'http://你的FlaskAPI地址/create-data',
    data: data,
  );
  // 处理响应
}

注意事项

  • Flask端配置:确保Flask的Session配置正确,跨域场景下需用flask-cors包并设置supports_credentials=True;生产环境建议开启SESSION_COOKIE_SECURE=True(仅HTTPS下传输Cookie),SESSION_COOKIE_SAMESITE根据跨域情况设置为Lax或None。
  • Cookie过期:Flask的Session Cookie默认有过期时间,两种方案都会自动识别并处理过期的Cookie。
  • 本地存储安全:敏感场景下可以考虑对存储的Cookie进行加密,避免明文泄露。

内容的提问来源于stack exchange,提问作者Ananta Dev Datta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:55:18