Flutter for OpenHarmony:dio_cookie_manager 让 Dio 发挥会话管理能力,像浏览器一样自动处理 Cookie 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:dio_cookie_manager 让 Dio 发挥会话管理能力,像浏览器一样自动处理 Cookie 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

前言

在移动端开发中,我们通常使用 JWT (Authorization Header) 进行身份验证。但如果你的后端是基于 Session/Cookie 的老系统(如 PHP/Java JSP),或者你需要对接网页爬虫,那么 Cookie 的管理就变得至关重要。

dio 本身是不存储 Cookie 的。dio_cookie_manager 是一个官方推荐的拦截器,它结合 cookie_jar 库,能自动从响应头提取 Set-Cookie,并在下次请求时带上 Cookie,完全模拟浏览器的行为。

一、概念介绍/原理解析

1.1 基础概念

  • CookieManager: Dio 的拦截器,负责提取和注入 Cookie。
  • CookieJar: 内存中的 Cookie 存储器(App 重启丢失)。
  • PersistCookieJar: 持久化的 Cookie 存储器(存在文件系统,重启保留)。

请求前拦截

加载 Cookie

注入请求头

发送

带有 Set-Cookie

保存 Cookie

写入存储

Dio 请求

CookieManager

CookieJar

服务端

Dio 响应

1.2 进阶概念

它可以处理 Cookie 的 Path, Domain, Secure, HttpOnly 属性,确保 cookie 不会泄露给错误的域名。还可以通过自定义 Storage 实现将 Cookie 存入加密数据库。

二、核心 API/组件详解

2.1 依赖安装

dependencies:dio: ^5.0.0 cookie_jar: ^4.0.0 dio_cookie_manager: ^3.0.0 path_provider: ^2.0.0 # 用于持久化

2.2 基础用法(内存模式)

import'package:dio/dio.dart';import'package:dio_cookie_manager/dio_cookie_manager.dart';import'package:cookie_jar/cookie_jar.dart';voidmain()async{final dio =Dio();final cookieJar =CookieJar();// 注入拦截器 dio.interceptors.add(CookieManager(cookieJar));// 第一次请求:登录,服务端 Set-Cookie: session=123await dio.post('https://api.example.com/login');// 第二次请求:自动带上 Cookie: session=123await dio.get('https://api.example.com/user/profile');}
在这里插入图片描述

2.3 持久化(重启不掉线)

import'package:path_provider/path_provider.dart';voidinitDio()async{// 获取应用文档目录final appDocDir =awaitgetApplicationDocumentsDirectory();// 创建持久化 Jarfinal persistJar =PersistCookieJar( storage:FileStorage("${appDocDir.path}/.cookies/"),); dio.interceptors.add(CookieManager(persistJar));}
在这里插入图片描述

三、常见应用场景

3.1 场景 1:SSO 单点登录

对接企业内部的老旧 SSO 系统,需要多次重定向并携带 Cookie 才能获取最终 Token。

// CookieManager 会自动处理重定向过程中的 Cookie 变化await dio.get('https://sso.company.com/auth?service=myapp');

3.2 场景 2:WebView 同步

用户在 WebView 中登录了,App 原生请求也需要共享该登录状态。

// 手动提取 WebView 的 Cookie 并存入 Jarfinal cookies =await webview.getCookies();await cookieJar.saveFromResponse(Uri.parse(url), cookies);

3.3 场景 3:爬虫与自动化测试

模拟浏览器行为,抓取需要登录才能访问的网页数据。

// 伪造 User-Agent 和 Cookie dio.options.headers['User-Agent']='Mozilla/5.0...';await dio.get('https://www.zhihu.com');

四、OpenHarmony 平台适配

4.1 文件路径

path_provider 已完整适配 OpenHarmony,通过它获取的 ApplicationDocumentsDirectory 是完全符合鸿蒙沙箱规范的,因此 PersistCookieJar 可以放心使用。

4.2 跨域与安全

虽然 Dio 不是浏览器,不受同源策略限制,但鸿蒙系统的网络权限管理通过 module.json5 控制。如果 Cookie 中包含 HttpOnly,dio_cookie_manager 依然能处理(因为它是在 Dart 层模拟),但要注意不要将敏感 Cookie 打印到日志中。

五、完整示例代码

本示例展示在鸿蒙应用中实现一个“记住登录状态”的功能。首次登录后,即使重启 App,Cookie 依然存在,无需再次登录。

import'package:flutter/material.dart';import'package:dio/dio.dart';import'package:cookie_jar/cookie_jar.dart';import'package:dio_cookie_manager/dio_cookie_manager.dart';import'package:path_provider/path_provider.dart';// 模拟 APIconstString _loginUrl ='https://httpbin.org/cookies/set/session/abcdefg';constString _profileUrl ='https://httpbin.org/cookies';voidmain(){runApp(constMaterialApp(home:CookiePage()));}classCookiePageextendsStatefulWidget{constCookiePage({super.key});@overrideState<CookiePage>createState()=>_CookiePageState();}class _CookiePageState extendsState<CookiePage>{String _status ='未初始化'; late Dio _dio;PersistCookieJar? _cookieJar;@overridevoidinitState(){super.initState();_initDio();}Future<void>_initDio()async{try{final dir =awaitgetApplicationDocumentsDirectory();// 在 OpenHarmony 沙箱目录下存储 Cookie _cookieJar =PersistCookieJar(storage:FileStorage("${dir.path}/cookies")); _dio =Dio(); _dio.interceptors.add(CookieManager(_cookieJar!));setState(()=> _status ='已就绪 (路径: ${dir.path})');}catch(e){setState(()=> _status ='初始化失败: $e');}}Future<void>_login()async{if(_cookieJar ==null)return;try{setState(()=> _status ='正在登录...');// 访问此 URL 会使服务器设置 Set-Cookieawait _dio.get(_loginUrl);setState(()=> _status ='登录成功,Cookie 已保存');}catch(e){setState(()=> _status ='登录错误: $e');}}Future<void>_checkProfile()async{if(_cookieJar ==null)return;try{setState(()=> _status ='正在检查会话...');// 访问此 URL 会返回当前请求带的所有 Cookiefinal response =await _dio.get(_profileUrl);setState(()=> _status ='API 返回:\n${response.data}');}catch(e){setState(()=> _status ='请求错误: $e');}}Future<void>_logout()async{if(_cookieJar ==null)return;// 清除所有 Cookieawait _cookieJar!.deleteAll();setState(()=> _status ='已退出登录 (Cookie 清除)');}@overrideWidgetbuild(BuildContext context){returnScaffold( appBar:AppBar(title:constText('Dio Cookie 示例')), body:Padding( padding:constEdgeInsets.all(16.0), child:Column( children:[Text('状态: $_status', style:constTextStyle(fontSize:16)),constSizedBox(height:20),SingleChildScrollView( scrollDirection:Axis.horizontal, child:Row( children:[ElevatedButton(onPressed: _login, child:constText('模拟登录')),constSizedBox(width:10),ElevatedButton(onPressed: _checkProfile, child:constText('检查 Session')),constSizedBox(width:10),OutlinedButton(onPressed: _logout, child:constText('清除 Cookie')),],),),],),),);}}
在这里插入图片描述

六、总结

dio_cookie_manager 是对接基于 Session 的旧系统的唯一正确姿势。

最佳实践

  1. 单例模式PersistCookieJar 涉及到文件锁,建议全局只创建一个实例,否则可能出现读写冲突。
  2. 清理策略:虽然 Session 会过期,但持久化的 Cookie 文件却不会自动删除。可以在 App 启动时调用 .deleteExpired() 来清理过期的 Cookie。

Read more

量化、算子融合、内存映射:C语言实现AI推理的“三板斧“

量化、算子融合、内存映射:C语言实现AI推理的“三板斧“

量化、算子融合、内存映射:C语言实现AI推理的"三板斧" 摘要:做嵌入式AI开发的同学,大概率都遇到过这样的困境:训练好的AI模型(比如CNN),在PC上用TensorFlow/PyTorch跑起来流畅丝滑,可移植到单片机、MCU等边缘设备上,要么内存爆掉,要么推理延迟高到无法使用——毕竟边缘设备的资源太有限了:几百KB的RAM、几MB的Flash、没有GPU加速,甚至连浮点运算都要靠软件模拟。这时,依赖庞大的深度学习框架就成了“杀鸡用牛刀”,甚至根本无法运行。而C语言,作为嵌入式开发的“母语”,凭借其极致的性能控制、内存可控性和无 runtime 依赖的优势,成为边缘设备AI推理引擎的最佳选择。但纯C语言实现AI推理,绝不是简单地“用C重写框架代码”,关键在于掌握三大核心优化技术——这就是我们今天要讲的AI推理“三板斧”:量化、算子融合、内存映射。 它们三者协同作用,能从“体积、速度、内存”三个维度彻底优化AI推理性能:

By Ne0inhk
Linux:早期操作系统的系统调用

Linux:早期操作系统的系统调用

相关阅读 Linuxhttps://blog.ZEEKLOG.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482 简介         本文将以Linux1.0为例说明早期操作系统的系统调用过程。         Linux1.0总共提供了135个系统调用(其中一些是保留或未实现),可以在源码路径linux-1.0/include/linux/sys.h下找到系统调用函数声明,在源码路径linux-1.0/include/linux/unistd.h下找到系统调用号定义。         下面列举出了一些系统调用的相关信息。 系统调用号系统调用函数名系统调用函数原型含义定义位置0sys_setupasmlinkage int sys_setup(void * BIOS)完成系统设备初始化(磁盘)、加载 RAM 盘、挂载根文件系统。linux-1.0/drivers/

By Ne0inhk
WSL2 + Ubuntu 22.04 全流程安装与避坑指南(适配 D 盘)

WSL2 + Ubuntu 22.04 全流程安装与避坑指南(适配 D 盘)

适用于:Windows 10/11 用户 目标:在 D 盘上部署完整可联网的 Ubuntu 22.04 + GPU 支持的开发环境 作者:jiahao(实际踩坑实践) 更新时间:2025-10 📋 一、前置条件检查 * Windows 已升级到 21H2 或更高版本; * 已安装 NVIDIA 显卡驱动 ≥ 510(支持 CUDA 12); * Windows 已安装 PowerShell 7+; * 本机具备管理员权限; * 可联网。 🧹 二、彻底清理旧版 WSL 环境 很多用户安装不干净是因为旧版本遗留。执行以下命令可完全重置。 1️⃣ 查看已安装发行版 wsl --list --all 如果看到:

By Ne0inhk
【鸿蒙2025领航者闯关】从技术突破到生态共建,开发者的成长与远航

【鸿蒙2025领航者闯关】从技术突破到生态共建,开发者的成长与远航

文章目录 * 前言 * 第一章 鸿蒙开发入门:认知全场景操作系统的核心魅力 * 1.1 鸿蒙操作系统的核心定位 * 1.2 鸿蒙开发的核心技术底座 * 1.2.1 分布式技术:设备协同的“灵魂” * 1.2.2 ArkUI:全场景UI开发的“利器” * 1.2.3 鸿蒙应用的两种形态:FA与HAP * 第二章 技术成长突破:从单端开发到跨设备协同的蜕变 * 2.1 成长痛点:单端开发的“能力天花板” * 2.2 核心突破一:掌握ArkUI多端自适应开发 * 2.2.1 声明式编程的思维转变 * 2.2.2 多端自适应的核心技术:布局约束与媒体查询 * 2.

By Ne0inhk