Sinatra 会议成员“失踪”

Wes*_*lte 5 ruby session heroku sinatra

我已经成功解决了会话成员不可用的问题,即使它们已设置,我想知道为什么会发生这种情况。我的情况可以描述为:

  1. Sinatra 应用程序使用:session.
  2. 使用 oAuth 对用户进行授权,并在此过程中设置:ret_url会话成员,以便应用程序知道在身份验证后返回到哪里。
  3. 服务器是 Cedar 堆栈上的独角兽 (Heroku)

这在本地运行时效果很好,但:ret_url会话成员从 Heroku 上的会话中完全消失了。我发现如果我删除这段代码就可以解决问题:

  before do
    cache_control :public, :must_revalidate, :max_age => 60
  end
Run Code Online (Sandbox Code Playgroud)

问题 1:我猜测我的 cookie 被缓存:ret_url但没有值,这就是它被破坏的原因?

问题 2:我按照下面的路由条件代码所示设置会话成员,这是错误的地方吗?

  # redirect users to login if necessary
  set(:auth) do |access_token|      
    condition do

      if request.request_method == 'GET'
        session[:ret_url] = request.path_info 
      end

      redirect '/' unless user_logged_in?
    end
  end
Run Code Online (Sandbox Code Playgroud)

我想使用缓存并且仍然让我的 cookie 有效。

Unc*_*ene 1

在不了解所有细节的情况下很难看到发生了什么,但是您很可能违反了一个简单的规则:不要在应该执行某些操作(除了显示页面之外)的操作上使用 http 缓存。当 http 缓存打开时,浏览器甚至不会尝试重新加载页面并从浏览器缓存中呈现它。

Cookie 不会缓存在任何地方,cache_control 唯一做的就是设置 CacheControl http 响应值

在您的情况下,您可以做的最好的事情是将没有操作页面的路由列表添加到您的 before 块中:

before '/my/static/page' do
  cache_control :public, :must_revalidate, :max_age => 60
end
Run Code Online (Sandbox Code Playgroud)

最有可能的是,您可以从 http 缓存中受益的路由集非常有限