2011-05-28 16 views
5

出於某種原因,我的RoR應用程序中的會話處理程序似乎在許多用戶的生產中表現怪異。我正在使用默認的RoR ActiveRecord Session Store,並且在開發中一切正常。只要我保持瀏覽器打開狀態,每次修改會話時都會更新一個現有的數據行,就像您期望的會話正常工作一樣。當進入生產服務器時,我親自觀察到同樣的行爲。然而,在數據庫中查找的時候,我看到很多行就像這個截圖:爲什麼Ruby on Rails會在每次擊中(有時)時創建新的會話?

http://imageshack.us/f/191/screenshot20110527at832.png/(很抱歉,但我不能在這裏直接,因爲我是一個新的用戶包括圖像)

該網站包含在iframe在另一個網站上,並有一個調度程序,它將基於某些會話數據將用戶發送(redirect_to)到同一控制器中的另一個操作,即對於所有用戶,相同的URL(mydomain.com/dispatcher)將包含在iframe中。映射到此URL的操作將根據會話[:current_action]決定將用戶重定向到何處。

該網站幾乎沒有任何流量,所以沒有辦法,實際上有約。 10個不同的用戶每秒向網站發出請求。實際上,我可以在production.log中看到,而被重定向,因此用戶具有不同的session_id,例如,當訪問調度程序時,用戶可能會有一個特定的sessionid,並且在請求實際的目標操作時(作爲調度程序中的redirect_to的結果),sessionid將更改爲其他內容。此外,會話數據行中的大多數(大於16000個數據行的97.5%)具有0秒的「壽命」(即,created_at等於updated_at)。

你有什麼想法可能會導致這個問題?

有沒有可能redirect_to調用RoR會話處理?

非常感謝您提前對您的想法!

+0

您的數據庫可能有問題嗎?這是一個常見問題,您是否嘗試過在開發中使用相同類型的數據庫,然後問題是否會持續存在? – 2011-05-28 04:06:19

+0

你自己的曲奇在製作上看起來如何?也許你有一個不可思議的設置,爲每個子目錄/資源創建一個新的cookie? – 2011-05-28 04:22:51

回答

1

由於某種配置錯誤或從數據庫獲取會話的問題,您的訪問者有可能因爲每個請求而發佈新的session_id值。使用基於Cookie的會話時,常見問題是Cookie正在分配給錯誤的域,或者在訪問www版本時,您在主機名稱www.example.comexample.com之間存在衝突。

另一個問題可能是會話的簽名被拒絕,並自動創建一個新的會話。

您可能想要創建一個診斷頁面,該頁面只需爲特定用戶傾倒session.session_id,然後重新加載該頁面以確保獲得一致的結果。

如果您使用Firebug,請查看標題以查看是否將會話重新分配給每個請求。

+0

@Devin M:謝謝,但我不認爲這是問題所在。我在這兩種情況下使用mysql,並且數據庫設置在dev/prod中看起來非常相似。 – jhuebner 2011-05-28 04:57:44

+0

@John Bachir:這是一個奇怪的部分 - 到目前爲止,我無法親自再現這個問題。我似乎是那些沒有發生問題的幸運用戶中的一個幸運的2.5%。對我來說,會話​​cookie(只有一個,因爲我將會話內容存儲在數據庫中)看起來非常好。這對於開發和生產都是如此。 這是會話cookie的樣子: 名稱\t _myapp_session 價值\t 73d4f19392a26e0599006756efc61727 主機\t本地主機 路徑\t/ 安全\t沒有 過期\t在結束會話 通過網頁瀏覽時,該值保持不變。 – jhuebner 2011-05-28 05:04:10

+0

我看過Firebug,並通過所有請求(即所有重定向),我有相同的session_id。在服務器日誌中,我也無法檢測到指示數據庫讀取錯誤的任何內容(即使對於我知道它們具有0秒壽命的會話)也是如此。 雖然你對會話拒絕的想法聽起來很有趣。我如何最好地檢查?非常感謝你的幫助! – jhuebner 2011-05-28 05:17:55

2

原來有兩個問題:

  1. 在Internet Explorer中的第三方Cookie:因爲網站被列入在iframe中,所有的IE(IE6-IE9)將阻止cookie包括會話cookie 。在此之後,將在每次重定向時向用戶提供新的session_id。另外,當在Rails中的會話存儲之間切換時(例如,在Cookie和ActiveRecord Session Store之間),所有現有的會話都應該被刪除/過期。否則,回報率將產生巨大的session_ids,像下面的SQL語句:

    {:SQL =>「INSERT INTO sessionssession_iddatacreated_atupdated_at)VALUES( 'BAh7CUkiD3Nlc3Npb25faWQGOgZFRiIlZmRhMzRjMzdiOWU0YjhhMzIyNGU0Y2IwOWZiN2E4YTJJIgptdHVyawY7AEZ7CToSYXNzaWdubWVudF9pZEkiIEFTU0lHTk1FTlRfSURfTk9UX0FWQUlMQUJMRQY7AFQ6C2hpdF9pZEkiIzJRRzhUTktJTVpTTVU4U1ZSR0ZNNVBHVjRNTFlCRQY7AFQ6Dndvcmtlcl9pZEkiE0ExQzdBNFFYUE5DOTRDBjsAVDoPc3VibWl0X3VybEkiGmh0dHBzOi8vd3d3Lm10dXJrLmNvbQY7AFRJIhVza2lwcGVkX3Rhc2tfaWRzBjsARlsGaQBJIhBfY3NyZl90b2tlbgY7AEZJIjFvbHJiK2tSaDZ1dDhyZ011VmUyZnZrY01wWWFuQll6cVY1YWZ4M0c1QkhFPQY7AEY = - a4223802cfb90e6c75578cc1a27427cf96778598',' BAh7B0kiCm10dXJrBjoGRUZ7AEkiEmlzX2Rpc3BhdGNoZWQGOwBGVA == \ n','201 28年1月5日5時47分19' 秒, '2011-05-28 5點47分19秒')

其結果是,MySQL的截斷session-id以適應255個字符(默認列會話遷移後的列規範)。因此,在以下請求中,rails試圖使用(非常長)session_id恢復會話 - 當然沒有成功。

我試圖通過將下面的HTTP響應頭修復IE問題:

response.header["P3P"] = 'CP="CAO PSA CONi OTR OUR DEM ONL"' 

然而,這似乎並沒有工作,這就是爲什麼我重寫應用程序在沒有任何會話信息工作所有。不過,任何進一步的提示將被讚賞以供將來參考。

相關問題