2014-09-29 49 views
0

我有一個rails應用程序'A',它在另一個應用程序的iframe上運行'B'。當應用程序'A'加載到'B'的iframe時,我正在設置會話中的一些值。當用戶執行應用程序'B'的某些操作時,我想銷燬這些會話值。所以,我創建了一個簡單的API方法,它只是刪除會話值。每當要刪除會話值的API被調用時,API調用都會成功,但會話值似乎不存在於該方法中。Rails 4:從API調用中刪除會話值

我用了三種應該工作的方法。但它不起作用。該API::AController方法是:

def delete_session_value 
    session.key?(:value) # Returns false here 
    reset_session # 1 
    session[:value] = nil # 2 
    session.delete(:value) # 3 
end 

會議由ApplicationController設置簡單的任務session[:value] = 'something'。會話值可在整個應用程序中訪問。 API控制器無法訪問會話值?有沒有其他方法可以解決這個問題而不影響流量?

+0

因此'B'在'A'上調用API方法?你看到任何調試輸出提示有問題嗎?你可以在'delete_session_value'中添加一些'puts'語句來確保它實際上被調用嗎? – Hbcdev 2014-09-29 14:35:11

+0

是的。它在A上調用API方法。這就是爲什麼我在方法的開頭提到了'session.key?(:value)#在這裏返回false'的原因。我用'binding.pry'來驗證它是否被實際調用。 – nebula 2014-09-29 14:38:36

回答

0

如果會話存儲是基於cookie(默認情況下是),那麼這是一個正確的行爲。您無法從iframe讀取會話cookie(或任何其他cookie)。見https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

如果這是同源請求您可以嘗試將您的x-frame-options標頭設置爲SAMEORIGINhttps://developer.mozilla.org/pl/docs/HTTP/X-Frame-Options

+0

是的。這是默認情況下的cookie。我使用了'config.action_dispatch.default_headers = { 'X-Frame-Options'=>'ALLOWALL' }'並希望閱讀會話。還有其他的選擇嗎? – nebula 2014-09-29 14:47:16

+0

'ALLOWALL'確實存在,但它不會讓你對iFrame中的cookies做任何事情,它可以說服務器很高興在任何頁面上的iFrame中呈現內容。這是關於是否顯示內容,而不是Cookie是否可以訪問。 – Hbcdev 2014-09-29 15:08:58

+0

@Hbcdev謝謝你指出這一點。這是所有瀏覽器都認可的嗎? (MDN沒有提到它)。如果我理解它是正確的,則此選項是爲了[廣告原因]而引入的(http://ipsec.pl/web-application-security/2013/mess-x-frame-options-allowall.html) – Ernest 2014-09-29 15:19:50