Flutter中使用Cookies

Cookie 是一种在用户的浏览器中存储的小型文本文件,用于保存有关用户和他们的访问信息。它们通常用于以下目的:

|------|-----------------------------------------------------------------------------------------------------------------------|
| 主要功能 | * 会话管理:保持用户登录状态,例如识别已登录的用户。 * 个性化设置:保存用户的偏好设置,如语言、主题等。 * 跟踪和分析:跟踪用户的行为,以便进行分析和广告投放。 |
| 结构 | * 名称:Cookie 的标识符。 * :与名称关联的数据。 * 过期时间:指定 Cookie 的有效期。 * 路径:定义 Cookie 的有效范围。 * :限制 Cookie 的访问范围。 |
| 工作原理 | * 当用户访问网站时,服务器可以发送 Cookie 到浏览器,浏览器会将其存储。 * 在用户的后续请求中,浏览器会自动将相关 Cookie 发送回服务器,以便进行身份验证或提供个性化服务。 |
| 类型 | * 会话 Cookie:在浏览器关闭时失效。 * 持久性 Cookie:在设定的过期时间之前一直有效。 |

封装Cookies类

复制代码
import 'dart:html' as html;
 
class Cookies {
  // 单例模式
  static final Cookies _instance = Cookies._internal();
 
  factory Cookies() {
    return _instance;
  }
 
  Cookies._internal(); // 私有构造函数
 
  // 设置 cookie
  static void set(String name, String value,
      {Map<String, dynamic>? attributes}) {
    if (attributes != null && attributes.containsKey('expires')) {
      if (attributes['expires'] is int) {
        final expires =
            DateTime.now().add(Duration(days: attributes['expires']));
        attributes['expires'] = expires.toUtc().toIso8601String();
      }
    }
 
    name = Uri.encodeComponent(name);
    String cookieString = '$name=${Uri.encodeComponent(value)}';
 
    attributes?.forEach((key, value) {
      if (value != null) {
        cookieString += '; $key';
        if (value is String) {
          cookieString += '=${Uri.encodeComponent(value)}';
        }
      }
    });
 
    html.document.cookie = cookieString;
  }
 
  // 获取 cookie
  static String? get(String name) {
    if (name.isEmpty) {
      return null;
    }
 
    var cookies = html.document.cookie?.split('; ') ?? [];
    for (var cookie in cookies) {
      var parts = cookie.split('=');
      var value = parts.sublist(1).join('=');
 
      try {
        var found = Uri.decodeComponent(parts[0]);
        if (name == found) {
          return value;
        }
      } catch (e) {
        // 处理异常
      }
    }
    return null;
  }
 
  // 删除 cookie
  static void remove(String name, {Map<String, dynamic>? attributes}) {
    set(name, '', attributes: {
      ...?attributes,
      'expires': -1, // 设置为 -1,表示立即过期
    });
  }
}

方法描述

方法 入参含义 描述
set (name, value, attributes) name:Cookie 的标识符。 value:与名称关联的数据 attributes:{ //其他配置 expires:过期时间(天),int类型 path:路径,默认是/ } 设置Cookie
remove(name,attributes) name:Cookie 的标识符。 attributes:{ //其他配置 expires:过期时间(天),int类型 path:路径,默认是/ } 删除Cookie
get(name) name:Cookie 的标识符 读取Cookie
相关推荐
谭光志5 小时前
Vibe Coding 时代,程序员该何去何从
前端·后端·ai编程
仿生狮子7 小时前
别再说“全栈”了,AI 时代团队只认这 5 种人
前端·人工智能·后端
kyriewen7 小时前
AI 写的 React 组件,合并前必查的 6 个坏味道——每个都有代码对比
前端·javascript·react.js
Highcharts.js7 小时前
软件开发公司为什么选择 Highcharts?
前端·前端框架·echarts·数据可视化·技术选型·highcharts·图表工具
阿祖zu8 小时前
企业 AI 转型之痛,个人提效十倍不止,组织效率仍止步不前?
前端·aigc·agent
摇滚侠9 小时前
SpringBoot3+Vue3 全套视频教程 45-51
前端·javascript·vue.js
酸梅果茶10 小时前
【6】lightning_lm项目-LIO 前端 -点云预处理模块
前端·slam
Hilaku10 小时前
前端大裁员背后的恐慌:我们还剩什么底牌?
前端·javascript·程序员
咖啡无伴侣11 小时前
unplugin-auto-import 使用详解+面试高频考点
前端·架构
搬砖记录员11 小时前
录屏文件打不开?H.265兼容性踩坑与4种实战方案
前端