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