Help us learn about your current experience with the documentation. Take the survey.

访问会话数据

GitLab 中的会话数据存储在 Redis 中,可以通过多种方式访问。

例如,在 Web 请求期间:

  • Rails 通过 ActionDispatch::Session 提供从控制器内部访问会话的能力。
  • 在控制器之外,可以通过 Gitlab::Session 访问会话。

在 Web 请求之外,仍然可以访问存储在 Redis 中的会话。例如:

  • 可以直接在 Redis 中查找 会话 ID 和内容。
  • 可以通过 ActiveSession 访问与该会话关联的 UserAgent 数据。

在会话中存储值时,最好遵循以下原则:

  • 使用简单的原始数据类型,避免存储对象,以避免序列化(marshaling)带来的复杂性。
  • 清理不再需要的变量,以降低 Redis 的内存使用。

GitLab::Session

有时,您可能希望将数据持久化存储在会话中,而不是像数据库这样的其他存储方式。Gitlab::Session 让您可以访问这些数据,而无需在代码中大量传递会话对象。例如,您可以在策略(policy)内部访问它,而无需在每次检查权限时都传递会话。

会话具有类似哈希(hash)的接口,就像在控制器中使用它一样。还有一个 NamespacedSessionStore 用于在哈希中存储键值对数据。

# 查询当前会话中存储的值
Gitlab::Session.current[:my_feature]

# 修改存储在 Redis 中的当前会话
Gitlab::Session.current[:my_feature] = value

# 在某个键下命名空间存储键值对数据
Gitlab::NamespacedSessionStore.new(:my_feature)[some_key] = value

# 为一段代码块(例如测试)设置会话
Gitlab::Session.with_session(my_feature: value) do
  # 使用 Session.current[:my_feature] 的代码
end

Redis

可以直接通过 Redis 访问会话数据。这可以在调试时让您检查浏览器会话。

# 获取会话列表
session_ids = Gitlab::Redis::Sessions.with do |redis|
  redis.smembers("#{Gitlab::Redis::Sessions::USER_SESSIONS_LOOKUP_NAMESPACE}:#{user.id}")
end

# 检索特定会话
session_data = Gitlab::Redis::Sessions.with { |redis| redis.get("#{Gitlab::Redis::Sessions::SESSION_NAMESPACE}:#{session_id}") }
Marshal.load(session_data)

使用 ActiveSession 获取设备信息

用户资料页面上的 活动会话 页面显示了用于访问每个会话的设备信息。其中用于列出会话的方法在开发时也很有用。

# 获取指定用户的会话列表
# 包含 session_id 和来自 UserAgent 的数据
ActiveSession.list(user)