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.22019 年 3 月 30 日

#5 in HTTP 服务器

Download history 12266/week @ 2024-05-03 13743/week @ 2024-05-10 12866/week @ 2024-05-17 13408/week @ 2024-05-24 12532/week @ 2024-05-31 12542/week @ 2024-06-07 13049/week @ 2024-06-14 11989/week @ 2024-06-21 11907/week @ 2024-06-28 12220/week @ 2024-07-05 12484/week @ 2024-07-12 13648/week @ 2024-07-19 13509/week @ 2024-07-26 12864/week @ 2024-08-02 11492/week @ 2024-08-09 9374/week @ 2024-08-16

49,725 每月下载量
65 个库中使用 (直接使用 36 个)

MIT/Apache

125KB
2K SLoC

actix-session

Actix Web 的会话管理。

crates.io Documentation Apache 2.0 or MIT licensed Dependency Status

Actix Web 的会话管理。

从表面上看,HTTP 协议是无状态的:客户端发送请求,服务器解析其内容,执行一些处理并返回响应。结果仅受提供的输入(即请求内容)和服务器在处理过程中查询的任何状态的影响。

无状态系统更容易推理,但它们并不像我们需要的那样强大 - 例如,如何认证用户?用户将被迫对每个请求进行认证。也就是说,例如,'基本' 认证就是这样工作的。虽然这可能适用于机器用户(即 API 客户端),但对于人来说并不实用 - 你不希望在浏览到的每个页面上都出现登录提示!

有一个解决方案 - 会话。使用会话,服务器可以将状态附加到来自同一客户端的一组请求。它们基于 cookie 构建 - 服务器在 HTTP 响应中设置一个 cookie(Set-Cookie 标头),客户端(例如浏览器)将存储该 cookie,并在发送新请求时将其发送回服务器(使用 Cookie 标头)。

我们称用于会话的 cookie 为 会话 cookie。其内容称为 会话密钥(或 会话 ID),而附加到会话的状态称为 会话状态

actix-session 提供了一个易于使用的框架,用于管理在 Actix Web 之上构建的应用程序中的会话。 SessionMiddlewareactix-session 提供功能的基础中间件;它负责处理所有会话cookie,并根据对活动 Session 执行的操作,指令 存储后端 创建/删除/更新会话状态。

actix-session 提供了一些内置的存储后端:(CookieSessionStoreRedisSessionStore) - 您可以通过实现 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