Ruby 机架:单个机架应用程序的多个会话cookie

Ruby 机架:单个机架应用程序的多个会话cookie,ruby,rack,Ruby,Rack,如何在单个机架应用程序中与多个会话cookie(用于不同的路径或域)交互 例如,考虑使用3个位置的以下应用程序: www.my-app.net=>主应用程序 www.my-app.net/app_a=>子app a app_b.my_app.net/=>子app b 应能够与3个会话cookie交互: 域名=www.my-app.net;路径=/ 域名=www.my-app.net;路径=/app_a domain=app_b.my-app.net/;路径=/ Rack::Session

如何在单个机架应用程序中与多个会话cookie(用于不同的路径或域)交互

例如,考虑使用3个位置的以下应用程序:

  • www.my-app.net=>主应用程序
  • www.my-app.net/app_a=>子app a
  • app_b.my_app.net/=>子app b
应能够与3个会话cookie交互:

  • 域名=www.my-app.net;路径=/
  • 域名=www.my-app.net;路径=/app_a
  • domain=app_b.my-app.net/;路径=/
Rack::Session::Cookie似乎是一个不错的选择,但作为一个中间件,会话Cookie必须在config.ru中设置,并且似乎每个Rack应用程序只能有一个会话Cookie

在这种特殊情况下,主机架应用程序点是方便地添加子应用程序,因此将应用程序划分为多机架应用程序以使用rack::Session::Cookie不是可行的解决方案

理想的方法是从机架应用程序代码内部与多个会话cookie自由交互

目前,我正在考虑:

  • 编写允许与多个会话cookie交互的中间件
  • 使用CGI::Cookie在应用程序内实现自定义会话Cookie管理
但这两种方法都非常繁琐,所以我想知道是否有更简单的方法来实现这一功能


提前感谢您的建议。

如果有人有同样的需求,我发现在应用程序中创建一个管理会话的类是最简单的方法

UTIL有两个很好的快捷方式,在处理cookie时,这可以让事情变得更简单

我正在将会话保存在应用程序使用的数据库中,但支持另一个后端应该很简单

作为旁注,我附带了一些注意事项:

  • 为了确保cookie的名称有效,我使用了子应用程序名称的sha-1
  • 用于生成会话密钥
  • 会话清理和刷新必须手动执行

示例代码 管理Cookie的类,提交函数设置并删除要机架的Cookie

class Framework::Response::Cookies

  def set( params )
    @cookies[params.delete( :name )] = params
  end

  def remove( params )
    @remove_cookies[params.delete( :name )] = params
  end

  def commit( headers )
    @cookies.each_pair do |name, params|
      Rack::Utils.set_cookie_header!( headers, name, params )
    end
    @remove_cookies.each_pair do |name, params|
      Rack::Utils.delete_cookie_header!( headers, name, params )
    end
  end

end
管理会话的类(使用Mongo作为后端):

class数据库::Mongo::Session{:name=>@session\u name,:id=>@session\u id},
:update=>{:expire=>expire,:name=>@session_name,:id=>@new_session_id | |@session_id,:variables=>@variables.to_hash},
:upsert=>true
})
@framework.response.cookies.set(
:name=>@session\u name,
:value=>@new_session_id | |@session_id,
:path=>@framework.applications.active.active_请求['path'],
:domain=>@framework.applications.active.active_请求['host'],
:httponly=>true
)
结束
def删除
@framework.content.db.remove(self.collection_name,{:id=>@session_id})
@framework.response.cookies.remove(:name=>@session\u name)
结束
结束
每次调用
@framework.response.cookies.set
时,它都会将cookie数据推送到
framework::response::cookies
@cookies
变量


在提供响应之前,调用
Framework::response::Cookies.commit
使用
Rack::Utils
提交Cookies

您能否添加一些关于如何在单个机架应用程序中管理多个Cookies的详细信息?如果我调用
使用Rack::Session::Cookie
我会得到当前会话的Cookie。但它似乎再次调用它,用新的cookie覆盖旧的cookie(我不能再访问旧的cookie了)?我应该创建多个类并在每个类中调用“use”以获得不同的cookie吗?感谢所有输入/代码示例@SteveMidgley我添加了一些示例代码,这些代码有点旧,所以可能有更好的方法来使用更新版本的rack。我希望有帮助。谢谢@Eric-我想我通过调用
response.set_cookie(key,string)
解决了我的问题-这会根据启用cookie时设置的cookie配置参数添加一个新的cookie键值集。再次感谢您的关注!
class Database::Mongo::Session < Session

  def save
    expire = Time.now + @session_ttl
    @framework.content.db.find_and_modify( self.collection_name, { 
      :query => { :name => @session_name, :id => @session_id }, 
      :update => { :expire => expire, :name => @session_name, :id => @new_session_id || @session_id , :variables => @variables.to_hash },
      :upsert => true 
    })
    @framework.response.cookies.set( 
      :name => @session_name,
      :value => @new_session_id || @session_id,
      :path => @framework.applications.active.active_request['path'],
      :domain => @framework.applications.active.active_request['host'],
      :httponly => true  
    )
  end

  def delete
    @framework.content.db.remove( self.collection_name, { :id => @session_id } )
    @framework.response.cookies.remove( :name => @session_name )
  end

end