35 个版本
0.10.0 | 2024 年 8 月 7 日 |
---|---|
0.9.0 | 2024 年 1 月 11 日 |
0.8.0 | 2023 年 9 月 16 日 |
0.7.2 | 2022 年 9 月 11 日 |
0.1.0-alpha.2 | 2019 年 3 月 30 日 |
#5 in HTTP 服务器
49,725 每月下载量
在 65 个库中使用 (直接使用 36 个)
125KB
2K SLoC
actix-session
Actix Web 的会话管理。
Actix Web 的会话管理。
从表面上看,HTTP 协议是无状态的:客户端发送请求,服务器解析其内容,执行一些处理并返回响应。结果仅受提供的输入(即请求内容)和服务器在处理过程中查询的任何状态的影响。
无状态系统更容易推理,但它们并不像我们需要的那样强大 - 例如,如何认证用户?用户将被迫对每个请求进行认证。也就是说,例如,'基本' 认证就是这样工作的。虽然这可能适用于机器用户(即 API 客户端),但对于人来说并不实用 - 你不希望在浏览到的每个页面上都出现登录提示!
有一个解决方案 - 会话。使用会话,服务器可以将状态附加到来自同一客户端的一组请求。它们基于 cookie 构建 - 服务器在 HTTP 响应中设置一个 cookie(Set-Cookie
标头),客户端(例如浏览器)将存储该 cookie,并在发送新请求时将其发送回服务器(使用 Cookie
标头)。
我们称用于会话的 cookie 为 会话 cookie。其内容称为 会话密钥(或 会话 ID),而附加到会话的状态称为 会话状态。
actix-session
提供了一个易于使用的框架,用于管理在 Actix Web 之上构建的应用程序中的会话。 SessionMiddleware
是 actix-session
提供功能的基础中间件;它负责处理所有会话cookie,并根据对活动 Session
执行的操作,指令 存储后端 创建/删除/更新会话状态。
actix-session
提供了一些内置的存储后端:(CookieSessionStore
,RedisSessionStore
) - 您可以通过实现 SessionStore
特性来创建自定义存储后端。
关于会话的进一步阅读
入门
要在您的 Actix Web 应用程序中使用会话,您必须在您的 App
上注册 SessionMiddleware
作为中间件。
use actix_web::{web, App, HttpServer, HttpResponse, Error};
use actix_session::{Session, SessionMiddleware, storage::RedisSessionStore};
use actix_web::cookie::Key;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
// When using `Key::generate()` it is important to initialize outside of the
// `HttpServer::new` closure. When deployed the secret key should be read from a
// configuration file or environment variables.
let secret_key = Key::generate();
let redis_store = RedisSessionStore::new("redis://127.0.0.1:6379")
.await
.unwrap();
HttpServer::new(move ||
App::new()
// Add session management to your application using Redis for session state storage
.wrap(
SessionMiddleware::new(
redis_store.clone(),
secret_key.clone(),
)
)
.default_service(web::to(|| HttpResponse::Ok())))
.bind(("127.0.0.1", 8080))?
.run()
.await
}
请求处理器可以使用 Session
提取器访问和修改会话状态。请注意,这在流式响应的流中不起作用。
use actix_web::Error;
use actix_session::Session;
fn index(session: Session) -> Result<&'static str, Error> {
// access the session state
if let Some(count) = session.get::<i32>("counter")? {
println!("SESSION value: {}", count);
// modify the session state
session.insert("counter", count + 1)?;
} else {
session.insert("counter", 1)?;
}
Ok("Welcome!")
}
选择后端
默认情况下,actix-session
不提供任何存储后端来检索和保存附加到您的会话的状态。您可以通过启用
-
基于cookie的纯“后端”,
CookieSessionStore
,使用cookie-session
功能标志。cargo add actix-session --features=cookie-session
-
基于Redis的后端,通过
redis
包,RedisSessionStore
,使用redis-session
功能标志。cargo add actix-session --features=redis-session
如果您想通过
native-tls
包以安全连接(通过native-tls
包)连接到 Redis,请添加redis-session-native-tls
功能标志cargo add actix-session --features=redis-session-native-tls
如果您更喜欢依赖于
rustls
,请使用redis-session-rustls
功能标志cargo add actix-session --features=redis-session-rustls
您可以使用 SessionStore
特性来实现自己的会话存储后端。
依赖关系
~15-29MB
~548K SLoC