某种原因,对于许多用户来说,我的 RoR 应用程序中的会话处理程序在生产中似乎表现得很奇怪。我正在使用默认的 RoR 活动记录会话存储,并且在开发中一切正常。只要我保持浏览器打开,每次修改会话时都会更新一个现有数据行,就像您希望会话正常工作一样。当转到生产服务器时,我个人观察到相同的行为。但是,在查看数据库时,我看到很多行,如以下屏幕截图所示:
http://imageshack.us/f/191/screenshot20110527at832.png/(抱歉,由于我是新用户,我无法在此处直接包含图像(
该网站包含在另一个网站的 iframe 中,并具有一个调度程序,该调度程序将根据某些会话数据将用户发送到 (redirect_to( 到同一控制器中的另一个操作,即对于所有用户,相同的 URL (mydomain.com/dispatcher( 将包含在 iframe 中。然后,映射到此 URL 的操作将根据 session[:current_action] 决定将用户重定向到的位置。
该网站几乎没有任何流量,因此实际上每秒不可能有大约 10 个不同的用户向网站发出请求。事实上,我可以在生产中看到.log在被重定向时,用户有不同的session_ids,例如,在访问调度程序时,用户可能具有特定的会话 ID,当请求实际目标操作时(由于调度程序中的redirect_to(,sessionid 将更改为其他内容。此外,大多数会话数据行(>= 16000 多个数据行的 97.5%(的"生存期"为 0 秒(即 created_at 等于 updated_at(。
你知道是什么可能导致这个问题吗?
redirect_to调用是否有可能弄乱 RoR 会话处理?
提前非常感谢您的想法!
由于某种配置错误或从数据库获取会话时出现问题,可能会为每个请求向访问者发出新的session_id
值。对于基于 Cookie 的会话,常见问题是 Cookie 被分配到错误的域,或者在访问www
版本时www.example.com
和example.com
主机名之间存在冲突。
另一个问题可能是会话上的签名被拒绝,并自动创建新会话。
你可能想要创建一个诊断页,该页只是转储特定用户的session.session_id
,然后重新加载该页以确保获得一致的结果。
如果您使用 Firebug,请查看标头,看看是否也为每个请求重新分配了会话。
事实证明有两个问题:
-
Internet Explorer 中的第三方 Cookie:由于网站包含在 iframe 中,因此所有 IE (IE6-IE9( 都会阻止包含会话 Cookie 的 Cookie。在此之后,用户将在每次重定向时获得一个新session_id。
-
此外,在 Rails 中的会话存储之间切换时(例如,在 Cookie 和 ActiveRecord 会话存储之间(,应删除/过期所有现有会话。否则,RoR 将生成巨大的session_ids,如以下 SQL 语句所示:
{:sql=>"插入
sessions
(session_id
,data
,created_at
,updated_at
( 值('BAh7CUkiD3Nlc3Npb25faWQGOgZFRiIlZmRhMzRjMzdiOWU0YjhhMzIyNGU0Y2IwOWZiN2E4YTJJIgptdHVyawY7AEZ7CToSYXNzaWdubWVudF9pZEkiIEFTU0lHTk1FTlRfSURfTk9UX0FWQUlMQUJMRQY7AFQ6C2hpdF9pZEkiIzJRRzhUTktJTVpTTVU4U1ZSR0ZNNVBHVjRNTFlCRQY7AFQ6Dndvv cmtlcl9pZEkiE0ExQzdBNFFYUE5DOTRDBjsAVDoPc3VibWl0X3VybEkiGmh0dHBzOi8vd3d3Lm10dXJrLmNvbQY7AFRJIhVza2lwcGVkX3Rhc2tfaWRzBjsARlsGaQBJIhBfY3NyZl90b2tlbgY7AEZJIjFvbHJiK2tSaDZ1dDhyZ011VmUyZnZrY01wWWFuQll6cVY1YWZ4M0c1QkhFPQY7AEY=--a4223802cfb90e6c75578cc1a27427cf96778598', 'BAh7B0kiCm10dXJrBjoGRUZ7AEkiEmlzX2Rpc3BhdGNoZWQGOwBGVA==', '2011-05-28 05:47:19', '2011-05-28 05:47:19'(
因此,MySQL截断了session-id
以适应255个字符(rails会话迁移后的默认列规范(。因此,在以下请求下,rails 试图使用(极长的(session_id
恢复会话 - 当然没有成功。
我试图通过添加以下HTTP响应标头来解决IE问题:
response.header["P3P"] = 'CP="CAO PSA CONi OTR OUR DEM ONL"'
但是,这似乎不起作用,这就是为什么我重写应用程序以在没有任何会话信息的情况下工作的原因。不过,任何进一步的提示将不胜感激,以供将来参考。
我正在使用 https://github.com/grosser/ie_iframe_cookies 来处理这个问题。除了处理此处所述的电子标签之外,它还处理了 jhuebner 提到的内容 http://robanderson123.wordpress.com/2011/02/25/p3p-header-hell/