ZetCode

Dart Cookie

最后修改于 2025 年 4 月 4 日

Dart 中的 Cookie 类表示 HTTP Cookie,用于在客户端和服务器之间维护状态。它是 dart:io 库的一部分,用于服务器端应用程序。

Cookie 存储在请求之间持久化的小块数据。它们对于 Web 应用程序中的会话、身份验证和用户跟踪至关重要。

基本定义

Cookie 对象包含名称-值对和可选属性。这些属性包括过期时间、域、路径、安全标志和 SameSite 策略。

该类提供了解析 Cookie 标头和格式化 HTTP Cookie 的方法。它同时处理服务器端 Cookie 的创建和客户端 Cookie 的解析。

创建基本 Cookie

此示例演示了如何创建仅包含名称和值的简单 Cookie。

main.dart
import 'dart:io';

void main() {
  var cookie = Cookie('session_id', 'abc123xyz456');
  
  print('Name: ${cookie.name}');
  print('Value: ${cookie.value}');
  print('ToString: $cookie');
}

我们创建一个带有名称和值的 Cookie。toString() 方法会将其正确格式化为 HTTP 标头。这是最基本的 Cookie 配置。

$ dart main.dart
Name: session_id
Value: abc123xyz456
ToString: session_id=abc123xyz456

带属性的 Cookie

此示例演示了设置各种 Cookie 属性,如过期时间。

main.dart
import 'dart:io';

void main() {
  var cookie = Cookie('preferences', 'dark_mode=true');
  
  cookie.domain = 'example.com';
  cookie.path = '/settings';
  cookie.expires = DateTime.now().add(Duration(days: 30));
  cookie.httpOnly = true;
  cookie.secure = true;
  
  print(cookie);
}

我们配置了一个带有域限制、路径、过期日期和安全标志的 Cookie。这些属性控制浏览器中的 Cookie 行为。

$ dart main.dart
preferences=dark_mode=true; Domain=example.com; Path=/settings; Expires=Sat, 04 May 2025 14:32:10 GMT; HttpOnly; Secure

解析 Cookie 标头

此示例演示了如何将 Set-Cookie 标头字符串解析为 Cookie 对象。

main.dart
import 'dart:io';

void main() {
  var header = 'user_token=xyz789; Max-Age=3600; Path=/; Secure; SameSite=Lax';
  
  var cookie = Cookie.fromSetCookieValue(header);
  
  print('Name: ${cookie.name}');
  print('Value: ${cookie.value}');
  print('MaxAge: ${cookie.maxAge}');
  print('Path: ${cookie.path}');
  print('Secure: ${cookie.secure}');
  print('SameSite: ${cookie.sameSite}');
}

fromSetCookieValue 构造函数解析 HTTP Set-Cookie 标头。它会自动将所有属性提取到 Cookie 对象属性中。

$ dart main.dart
Name: user_token
Value: xyz789
MaxAge: 3600
Path: /
Secure: true
SameSite: SameSite.lax

标头中的多个 Cookie

此示例演示了如何处理 HTTP 标头中的多个 Cookie。

main.dart
import 'dart:io';

void main() {
  var cookieHeader = 'session=abc123; lang=en_US; theme=dark';
  
  var cookies = Cookie.fromCookieValue(cookieHeader);
  
  for (var cookie in cookies) {
    print('${cookie.name}: ${cookie.value}');
  }
  
  // Modify one cookie
  cookies[1].value = 'fr_FR';
  print('\nModified: ${Cookie.toCookieValue(cookies)}');
}

我们解析了包含多个名称-值对的 Cookie 标头。该类提供了解析和序列化多个 Cookie 的方法,并遵循正确的 HTTP 格式。

$ dart main.dart
session: abc123
lang: en_US
theme: dark

Modified: session=abc123; lang=fr_FR; theme=dark

Cookie 安全功能

此示例展示了与安全相关的 Cookie 属性,如 SameSite 和 HttpOnly。

main.dart
import 'dart:io';

void main() {
  var secureCookie = Cookie('auth_token', 'secret123');
  
  secureCookie.httpOnly = true;
  secureCookie.secure = true;
  secureCookie.sameSite = SameSite.strict;
  secureCookie.maxAge = 1800; // 30 minutes
  
  print('Secure cookie: $secureCookie');
  
  // For sensitive operations
  var csrfCookie = Cookie('csrf_token', 'r4nd0mT0k3n');
  csrfCookie.sameSite = SameSite.lax;
  
  print('CSRF cookie: $csrfCookie');
}

我们配置了安全标志以防止 XSS 和 CSRF 攻击。HttpOnly 防止 JavaScript 访问,而 SameSite 限制跨站请求。

$ dart main.dart
Secure cookie: auth_token=secret123; Max-Age=1800; HttpOnly; Secure; SameSite=Strict
CSRF cookie: csrf_token=r4nd0mT0k3n; SameSite=Lax

最佳实践

来源

Dart Cookie 文档

本教程介绍了 Dart 的 Cookie 类,通过示例展示了创建、解析、安全功能以及用于 Web 开发的 HTTP 标头处理。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程