根据您使用的是Flutter Web还是移动端,获取cookie有不同的方法
对于Flutter Web:
- 在前端将凭据设置为true
- 在服务器上,在标头中添加"'Access-Control-Allow-Credentials', true",我在后端使用Dart(Alfred框架)
- 检查来自您的服务器的源是否与前端的主机和端口匹配
您的浏览器会自动重新发送cookie。
您可以使用以下命令在启动应用程序时定义特定端口 - "flutter run -d chrome --web-port 5555"
但是对于移动设备,您需要做一些技巧
我使用Dio包轻松定义onResponse/onRequest函数和有条件的导入来避免编译失败。(很遗憾withCredentials选项只适用于Web)
如果您想使用默认http类
只需创建您自己的onResponse/onRequest函数即可
NetworkConfig.dart
import 'package:dio/dio.dart';
import '../../../constants/url_paths.dart';
import 'get_net_config.dart'
if (dart.library.io) 'mobile_net_config.dart'
if (dart.library.html) 'web_net_config.dart';
class NetworkConfig {
final _client = getClient()
..options = BaseOptions(
baseUrl: url,
connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 6),
);
Dio get client => _client;
final Map<String, String> headers = <String, String>{
'Content-Type': 'application/json'
};
}
我使用另一个类来执行我的get、post...,该类继承了NetworkConfig
get_network_config.dart
import 'package:dio/dio.dart';
Dio getClient() => throw UnsupportedError('[Platform ERROR] Network client');
web_network_config.dart
import 'package:dio/browser.dart';
import 'package:dio/dio.dart';
Dio getClient() =>
Dio()..httpClientAdapter = BrowserHttpClientAdapter(withCredentials: true);
mobile_network_config.dart
import 'dart:io';
import 'package:<projet_name>/data/data.dart';
import 'package:dio/dio.dart';
Dio getClient() => Dio()
..interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) async {
options.headers['cookie'] = await localData.read('cookie');
return handler.next(options);
},
onResponse: (response, handler) {
response.headers.forEach((name, values) async {
if (name == HttpHeaders.setCookieHeader) {
final cookieMap = <String, String>{};
for (var c in values) {
var key = '';
var value = '';
key = c.substring(0, c.indexOf('='));
value = c.substring(key.length + 1, c.indexOf(';'));
cookieMap[key] = value;
}
var cookiesFormatted = '';
cookieMap
.forEach((key, value) => cookiesFormatted += '$key=$value; ');
await localData.write('cookie', cookiesFormatted);
return;
}
});
return handler.next(response);
},
));
localData是我的Flutter包装器,用于持久化本地cookie
如果您使用默认的Client()类,也可以像这样设置凭据。
import 'package:http/http.dart';
Client getClient() => BrowserClient()..withCredentials = true;