2011-08-08 41 views

回答

3

執行一大堆的測試後,好像殺會話的最有效的方法是用現在的值到期的JSESSIONID的cookie。

<cfcookie name="jsessionid" expires="now"/> 

這顯然假定使用J2EE會話變量。

如果沒有使用J2EE會話變量,那麼會話變量和客戶端變量似乎都被CFID和CFTOKEN cookie變量所取代。這意味着殺掉會話的唯一方法是使用現在的值過期cookie。

<cfcookie name="cftoken" expires="now"/> 
<cfcookie name="cfid" expires="now"/> 

此方法也會使客戶端變量無效。

似乎在不使用J2EE會話變量而不殺死客戶端變量的情況下終止會話的最佳方式是創建會在瀏覽器關閉時過期的會話cookie並檢查application.cfc請求處理下的值。如果該值不存在,請清除會話結構。

+0

這也幫助我,thx! – Nich

-1
structDelete(session, "CFTOKEN"); 
structDelete(session, "CFID"); 
structDelete(session, "JESSIONID"); 

將從結構中刪除鍵,但我不確定您是否會遇到CF'將這些變量重新應用到會話中的問題。

+0

這隻會刪除客戶端結構中的值。你也需要從cookie中刪除它們。 –

+0

好點。無論如何,我喜歡傑森的回答比我自己的回答更好。 :D –

6

這是比較容易說的事情之一。

自從我研究過這一點以來,已經有一段時間了,所以請理解您可能需要排除故障。

對於Java EE會話,我認爲它更容易一些,因爲您可以在會話中調用invalidate()。但不幸的是,這只是戰鬥的一半。你真的有幾個問題需要解決。他們是

  1. 找到某種方式來存儲你需要(序列化和存儲)

  2. 廢止舊會話(可能與Java EE和CF會議,但這樣做的方式任何現有的會話數據與CF會議是未公開)

  3. 過期舊餅乾

  4. 創建一個新的會話

  5. 數據從您保存在步驟1中新的會話舊的會話

  6. 設置新的Cookie複製爲新的會話

這似乎不太靠譜,潛在困難的部分是在一個請求中這樣做,因爲通常一個會話不會被創建,直到請求被創建並且cookie不會被設置直到返回響應。我認爲這是使用Java EE最簡單的方法,因爲你可以在舊會話中調用invalidate(),並通過調用getRequestContext()獲得一個新的getSession()(我相信這是事實,我相信它僅適用於Java EE會話)。

我已經考慮過如何使用CF會話來做這些事情,我唯一能想到的就是讓創建新會話的代碼向網站上的頁面發出CFHTTP請求,以便新會話可以成爲創建。 CFHTTP響應中會有一個新的cookie,然後您可以過期舊的cookie,並使用標籤設置新的cookie。

希望這有助於

+0

Hey Jason,在CFHTTP結束的時候,不會將這個響應從服務器*發送到服務器而不是客戶端?在這種情況下,客戶端不會建立新的會話。像往常一樣,Ben Nadel對如何強行結束會話有一些想法(http://www.bennadel.com/blog/1847-Explicitly-Ending-A-ColdFusion-Session.htm) –

+0

這就是第6步的目的。您從CFHTTP請求(服務器到服務器請求)收集cookie,然後手動將其設置回瀏覽器。 –

+0

啊,gotcha :),這是有道理的。 –

相關問題