ZetCode

Dart HttpSession

最后修改于 2025 年 4 月 4 日

Dart 中的 HttpSession 类为 Web 应用程序提供了服务器端会话管理。它允许在 HTTP 请求之间存储用户特定的数据。

会话对于在无状态 HTTP 中维护状态至关重要。Dart 的 HttpSession 使用 cookie 或 URL 重写来跟踪会话。

基本定义

HttpSession 代表一个服务器端会话,该会话在同一客户端的多个 HTTP 请求中持续存在。它是 Dart 的 dart:io 库的一部分。

主要功能包括键值存储、会话超时控制和自动会话 ID 生成。会话通常用于用户身份验证和偏好设置。

基本会话用法

此示例展示了基本的会话创建和数据存储。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  server.listen((request) async {
    var session = await request.session();
    session['visits'] = (session['visits'] ?? 0) + 1;
    
    request.response.write('Visits: ${session['visits']}');
    await request.response.close();
  });
}

我们创建了一个使用会话跟踪访问计数的服务器。每个客户端都有一个具有持久数据的唯一会话。会话会自动处理 ID 生成。

$ dart main.dart
// Access https://:8080 in browser
// Output: Visits: 1 (increments on refresh)

会话超时配置

此示例演示了设置会话超时时长。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  server.sessionTimeout = Duration(minutes: 30);
  
  server.listen((request) async {
    var session = await request.session();
    request.response.write('Session timeout: ${server.sessionTimeout}');
    await request.response.close();
  });
}

我们将服务器范围的会话超时配置为 30 分钟。在不活动后,会话会自动过期。超时适用于所有会话。

$ dart main.dart
// Output: Session timeout: 0:30:00.000000

会话数据管理

此示例展示了全面的会话数据操作。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  server.listen((request) async {
    var session = await request.session();
    var response = request.response;
    
    if (request.uri.path == '/login') {
      session['username'] = 'user123';
      session['last_login'] = DateTime.now();
      response.write('Logged in');
    } 
    else if (request.uri.path == '/logout') {
      await session.destroy();
      response.write('Logged out');
    }
    else {
      response.write('''
        Username: ${session['username']}
        Last login: ${session['last_login']}
      ''');
    }
    
    await response.close();
  });
}

我们实现了带有会话存储的登录/注销功能。destroy() 方法会完全清除会话数据。会话值在请求之间持久存在。

$ dart main.dart
// Access /login, then / to see stored data
// Access /logout to clear session

会话 ID 处理

此示例演示了直接处理会话 ID。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  server.listen((request) async {
    var session = await request.session();
    var response = request.response;
    
    response.write('''
      Session ID: ${session.id}
      Is new: ${session.isNew}
    ''');
    
    await response.close();
  });
}

我们显示了自动生成的会话 ID 以及会话是否是新会话。isNew 属性有助于识别首次访问者。

$ dart main.dart
// Output shows unique session ID and true/false for new session

安全会话 Cookie

此示例配置了安全会话 Cookie 属性。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  server.sessionCookieName = 'DART_SESSION';
  server.sessionCookiePath = '/app';
  server.sessionCookieHttpOnly = true;
  server.sessionCookieSecure = true;
  
  server.listen((request) async {
    var session = await request.session();
    request.response.write('Secure session configured');
    await request.response.close();
  });
}

我们为安全性自定义了会话 Cookie 属性。HttpOnly 防止 JavaScript 访问,Secure 要求 HTTPS。这些是最佳实践。

$ dart main.dart
// Sets secure cookie with custom name and path

最佳实践

来源

Dart HttpSession 文档

本教程通过实际示例介绍了 Dart 的 HttpSession 类,展示了会话管理、配置和安全最佳实践。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程