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
最佳实践
- 最小化数据:仅在会话中存储必要数据
- 安全 Cookie:始终使用 HttpOnly 和 Secure 标志
- 超时:设置合适的会话超时时长
- 清理:注销后销毁会话
- 验证:在每次请求时验证会话数据
来源
本教程通过实际示例介绍了 Dart 的 HttpSession 类,展示了会话管理、配置和安全最佳实践。
作者
列出 所有 Dart 教程。