2010年3月11日 星期四

將Ruby on rails的網頁用iframe嵌入時, 在ie6遇到的問題

就是這一行, 花了半天的時間在找BUG
response.headers['P3P'] = 'CP="CAO PSA OUR"', put in a before_filter action in application.rb
終於解決了.

事發原因:
把rails的網頁利用iframe的方式放到php的網頁,
而rails的網頁裡面有使用到login的功能, 也有用到session儲存狀態.
用了Safari, Firefox, Chrome都沒有問題, 偏偏只有IE 6有問題.

一開始發現有錯誤訊息
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

針對此訊息才發現有可能是被誤判為CSRF (Cross-Site Request Forgery) 攻擊, 所以根據Rails api的說明,
我在controller加上了
protect_from_forgery :except => :create
和在我的form加上
<%= javascript_tag "window._token = '#{form_authenticity_token}'" %>
雖然說明裡頭有提到是適用於非form_for helper產生的form, 但我還是試試看

結果, 是沒有該錯誤訊息, 但是也沒有正確的結果.
還是無法正常的login, 後來更進一步檢查, 程式可以正常的判斷是否是輸入正確的帳號和密碼,
但卻無法儲存session, 更酷的是, 我的session只存活在login之後的第一個頁面, 接下來session就不見了,

後來試著去google搜尋, "rails session reset ie6 "
才更明白我的問題是屬於"跨域session丢失問題"
參考了以下資料
http://www.blogjava.net/leekiang/archive/2010/01/28/311054.html
http://blog.javaflag.com/blog/?p=484
http://www.ruby-forum.com/topic/107696

終於找到問題徵結點, 還是ie6的問題
是Platform for Privacy Preferences Project (P3P) specification搞的鬼

沒有留言: