Skip to content

Distributed session ​

English | 中文

DistributedSessionManager manages cross-service business sessions (attributes, service credentials). It is not online presence, and not an alias for account SaSession.

Boundary vs Online ​

Distributed SessionOnlineManager
PurposeShared session data across servicesWho is online, push, kick notify
Typical APIscreate_session / set_attributemark_online / push_to_user
StorageDistributedSessionStorageOnlineStore (local / Dao)

You can use both; keep the responsibilities separate.

Storage adapters ​

In-memory and SaStorage / SaTokenDao adapters:

rust
use sa_token_core::{
    DistributedSessionManager, InMemoryDistributedStorage, SaStorageDistributedStorage,
};
use std::sync::Arc;
use std::time::Duration;

// Dev / single process
let storage = Arc::new(InMemoryDistributedStorage::new());

// Same SaStorage / Dao as the app
let storage = Arc::new(SaStorageDistributedStorage::from_dao(manager.dao().clone()));
// or from_config(storage, &config) / new(storage, key_prefix)

Manager ​

rust
use sa_token_core::ServiceCredential;
use chrono::Utc;

let dsm = DistributedSessionManager::new(
    storage,
    "order-service".into(),
    Duration::from_secs(3600),
);

dsm.register_service(ServiceCredential {
    service_id: "order-service".into(),
    service_name: "Order".into(),
    secret_key: "svc-secret".into(),
    created_at: Utc::now(),
    permissions: vec![],
})
.await?;
dsm.verify_service("order-service", "svc-secret").await?;

let session = dsm
    .create_session("user_1".into(), token_str.clone())
    .await?;

dsm.set_attribute(&session.session_id, "cart".into(), "[1,2]".into())
    .await?;
let cart = dsm.get_attribute(&session.session_id, "cart").await?;

dsm.refresh_session(&session.session_id).await?;
dsm.delete_session(&session.session_id).await?;

By login id: get_sessions_by_login_id, delete_all_sessions, delete_sessions_by_token.

Attach to SaTokenManager (optional) ​

rust
let manager = manager.with_distributed_manager(Arc::new(dsm));

You can still hold DistributedSessionManager directly in application state.

MIT OR Apache-2.0