访问会话数据
极狐GitLab 中的会话数据存储在 Redis 中,可以通过多种方式进行访问。
在 Web 请求期间,例如:
- Rails 通过 ActionDispatch::Session 从控制器内部提供对会话的访问。
- 在控制器之外,可以通过 极狐GitLab::Session 访问会话。
在 Web 请求之外,仍然可以访问存储在 Redis 中的会话。例如:
- 可以通过 直接在 Redis 中查找 会话 ID 和内容。
- 可以使用 ActiveSession 访问与会话关联的 UserAgent 的数据。
在会话中存储值时,最好:
- 使用简单的基本类型,避免存储对象以避免序列化的复杂性。
- 清理不再需要的变量,以降低 Redis 的内存使用。
极狐GitLab::Session
有时你可能希望将数据持久化到会话中,而不是其他存储(例如数据库)。极狐GitLab::Session 允许你访问会话,而无需将会话广泛传递。例如,你可以在策略中访问它,而不必将会话传递到检查权限的每个地方。
会话具有类似哈希的接口,就像在控制器中使用它一样。还有一个 NamespacedSessionStore,用于在哈希中存储键值数据。
ruby1# 查找存储在当前会话中的值 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 访问会话数据。这可以让你在调试时检查浏览器会话。
ruby1# 获取会话列表 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)