Rack可以使用自定义会话ID项而不是cookie:
require 'rack/session/abstract/id'
Run Code Online (Sandbox Code Playgroud)
Rack文档可能是一个有用的开始搜索的地方.我相信你正在寻找"跳过"选项(或"推迟"选项).
文档:
ID设置了实现基于id的会话服务的基本框架.发送给客户端以维护会话的Cookie仅包含id引用.只需要覆盖#get_session和#set_session.
所有参数都是可选的.
这些选项可以基于每个请求设置,位于env ['rack.session.options']的位置.此外,会话的id可以在key:id的options散列中找到.强烈建议不要更改其值.
是Rack :: Utils :: Context兼容.
默认不包括在内; 你必须要求'rack/session/abstract/id'才能使用.
资源:
class ID
DEFAULT_OPTIONS = {
:key => 'rack.session',
:path => '/',
:domain => nil,
:expire_after => nil,
:secure => false,
:httponly => true,
:defer => false,
:renew => false,
:sidbits => 128,
:cookie_only => true,
:secure_random => (::SecureRandom rescue false)
}
Run Code Online (Sandbox Code Playgroud)
我希望这能带给你一个领导......当你了解更多信息时,你能在这里分享你的成果吗?
神奇的诀窍是将选项:cookie_only => false与:defer => true.当然,标准的Rack :: Session :: Cookie在这里没有多大意义,所以你可以这样做:
use Rack::Session::Pool, :cookie_only => false, :defer => true
Run Code Online (Sandbox Code Playgroud)
有趣的是,您可以在运行时更改选项.在我的用例中,我实际上需要支持传统的基于cookie的机制以及显式参数传递样式,所以我做了以下事情:
class WebApp < Sinatra::Base
configure do
use Rack::Session::Pool, :key => 'session_id'
end
before do
# Switch to parameter based session management if the client is an ios device
if env['HTTP_USER_AGENT'] =~ /iOS/
session.options[:cookie_only] = false
session.options[:defer] = true
end
end
get '/' do
session[:user_id] ||= nil # This triggers a session-write, giving us a valid session-id
body "session_id=#{session.id}"
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2828 次 |
| 最近记录: |