ruby – Rack:单个机架应用程序的多个会话cookie

ruby – Rack:单个机架应用程序的多个会话cookie,第1张

概述如何在单个机架应用程序中与多个会话cookie(针对不同的路径或域)进行交互? 例如,考虑使用3个位置的以下应用程序: > www.my-app.net =>主应用程序 > www.my-app.net/app_a =>子应用程序A. > app_b.my_app.net/ =>子应用程序B. 应该可以与3个会话cookie进行交互: > domain = www.my-app.net;路径= / 如何在单个机架应用程序中与多个会话cookie(针对不同的路径或域)进行交互?

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

> www.my-app.net =>主应用程序
> www.my-app.net/app_a =>子应用程序A.
> app_b.my_app.net/ =>子应用程序B.

应该可以与3个会话cookie进行交互:

> domain = www.my-app.net;路径= /;
> domain = www.my-app.net;路径= / APP_A;
> domain = app_b.my-app.net /;路径= /;

Rack :: Session :: cookie似乎是一个不错的选择,但作为中间件,会话cookie必须在config.ru中设置,并且似乎仅限于每个机架应用程序一个会话cookie.

在这种特殊情况下,主机架应用程序点是轻松添加子应用程序,因此将应用程序划分到多个机架应用程序中以使用Rack :: Session :: cookie不是一个可行的解决方案.

理想的方法是从机架应用程序代码中自由地与多个会话cookie进行交互.

现在,我正在考虑:

>编写允许与多个会话cookie交互的中间件
>使用CGI :: cookie在应用程序内部实现自定义会话cookie管理

但两者都很乏味,所以我想知道是否有更简单的方法来实现这个功能.

提前感谢任何建议或建议.

解决方法 如果有人以相同的需求运行,我发现创建一个类来管理应用程序内的会话是最简单的方法.

Rack :: Utils有两个很好的快捷方式,Rack::Utils.set_cookie_header!和Utils.delete_cookie_header!,可以在处理cookie时更加轻松.

我在使用我的应用程序的数据库中保存会话,但支持另一个后端应该是微不足道的.

作为旁注,我提到了一些注意事项:

>为了确保cookie的名称有效,我为此目的使用了子应用程序名称的sha-1.
> SecureRandom.urlsafe_base64对于生成会话密钥很有用.
>必须手动实施会话清理和刷新.

示例代码

管理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,params )    end  endend

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

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 )  endend

每次调用@ framework.response.cookies.set时,它都会将cookie数据推送到Framework :: Response :: cookies类@cookies变量.

在提供响应之前,对Framework :: Response :: cookies.commit的调用使用Rack :: Utils提交cookie.

总结

以上是内存溢出为你收集整理的ruby – Rack:单个机架应用程序的多个会话cookie全部内容,希望文章能够帮你解决ruby – Rack:单个机架应用程序的多个会话cookie所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1275154.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存