我们面临一个奇怪的问题,在我们的 rails 3.2 应用程序(暂存环境)的会话中,很少有键/cookie 被删除/丢失,该应用程序具有以下缓存设置/配置。session store是cookie store,配置如下:
Appsrv::Application.config.session_store :cookie_store, {
:key => 'SSID',
:path => '/',
:domain => APP_CONFIG['site_url'].sub(/^https?:\/\//, ""),
:expire_after => 30.minutes,
:secret => 's23asdfe443534afdgstreggv234324we434',
:secure => false # cookie not for just https
}
rails cache store 是一个memcache store,我们使用dalli gem 来集成rails 和memcache。
以下配置已添加到不同的 .rb 文件中:
config.cache_store = :dalli_store, 'staging01:11211', 'staging02:11211', 'staging03:11211', 'staging04:11211'
{:namespace => "appsrv", :expires_in => 86400, :compression => true}
config.action_controller.perform_caching = true
不过,这种丢失 cookie 的情况发生的流程有点复杂。发生这种情况的场景如下:
- 用户通过访问 Appsrv 上的页面启动会话(rails 3.2 应用程序,此时在会话中设置了一些标识用户事务的变量)
- 转到外部网站进行身份验证。
- 认证成功后,外部网站重定向到 Java App 服务器。
- Java App 服务器记录身份验证并重定向回 Appsrv。
- 但是在此重定向之后,步骤 1 中设置的会话变量消失了。
一些奇怪的发现:事情在开发环境中完美运行,唯一的区别是:
config.action_controller.perform_caching = false
如果我们在暂存“config.action_controller.perform_caching=false”中有相同的设置,那么暂存也可以正常工作。即使“config.action_controller.perform_caching”设置为 false,缓存实际上在控制器和模型中正确发生。
所以问题是: 1. 当 config.action_controller.perform_caching 设置为 true 时,为什么会话 cookie 会被删除?2. config.action_controller.perform_caching 配置如果设置为 false 也允许缓存正常发生有什么意义?