极狐 GitLab

访问会话数据

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

在 Web 请求期间,例如:

  • Rails 通过 ActionDispatch::Session 从控制器内部提供对会话的访问。
  • 在控制器之外,可以通过 极狐GitLab::Session 访问会话。

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

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

在会话中存储值时,最好:

  • 使用简单的基本类型,避免存储对象以避免序列化的复杂性。
  • 清理不再需要的变量,以降低 Redis 的内存使用。

极狐GitLab::Session#

有时你可能希望将数据持久化到会话中,而不是其他存储(例如数据库)。极狐GitLab::Session 允许你访问会话,而无需将会话广泛传递。例如,你可以在策略中访问它,而不必将会话传递到检查权限的每个地方。

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

ruby
1# 查找存储在当前会话中的值 2极狐GitLab::Session.current[:my_feature] 3 4# 修改当前存储在 Redis 中的会话 5极狐GitLab::Session.current[:my_feature] = value 6 7# 在某个键下的命名空间中存储键值数据 8极狐GitLab::NamespacedSessionStore.new(:my_feature)[some_key] = value 9 10# 为一段代码设置会话,例如在测试中 11极狐GitLab::Session.with_session(my_feature: value) do 12 # 使用 Session.current[:my_feature] 的代码 13end

Redis#

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

ruby
1# 获取会话列表 2session_ids = 极狐GitLab::Redis::Sessions.with do |redis| 3 redis.smembers("#{极狐GitLab::Redis::Sessions::USER_SESSIONS_LOOKUP_NAMESPACE}:#{user.id}") 4end 5 6# 检索特定会话 7session_data = 极狐GitLab::Redis::Sessions.with { |redis| redis.get("#{极狐GitLab::Redis::Sessions::SESSION_NAMESPACE}:#{session_id}") } 8Marshal.load(session_data)

使用 ActiveSession 获取设备信息#

用户个人资料上的 活跃会话 页面 显示用于访问每个会话的设备信息。用于列出会话的方法在开发中也可能有用。

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