2011-05-15 80 views
2

當用戶請求一個頁面時,是否爲該用戶啓動了一個會話?從我所知道的情況來看,只要您發出頁面請求,會話就會開始...ColdFusion:何時定義會話變量?

如果是這種情況,您何時創建會話變量?即用戶名,密碼,偏好等......隨時都有?

回答

4

是的用戶的會話範圍是在第一個請求上設置的。但是,這取決於您希望何時設置各種標誌和值的偏好。不過,您可能不想將密碼放在會話範圍中。

我喜歡做的是把用戶特定的值放在用戶結構中。所以請求開始我會檢查變量並設置它是否不存在。例如...

<cfif not structkeyexists(session, "user")> 
    <cfset session.user = { 
     authorized = false 
     , admin = false 
     , username = '' 
     , accountid = '' 
     <!--- etc ---> 
    } /> 
</cfif> 

當您的用戶登錄就可以填入相應的值並設置session.user.authorized =真

當用戶登出廣告最棒的這種做法是你可以刪除用戶結構。

<cfset structdelete(session, "user") /> 

然後在下一頁上再次檢查用戶結構,如果它不存在則創建。

+0

哦,我很喜歡這個方法,Dan。在PHP中,直到你明確地告訴它開始,會話纔會啓動。這就是我混淆的地方。但爲什麼不把結構創建放在應用程序的開始或會話開始之內? – dcolumbus 2011-05-18 00:41:17

+0

這裏的想法是,一個會話在技術上可以由多人共享。如果一個人坐在瀏覽器上,使用它,登錄,註銷等等,然後另一個人坐下來,並開始在ColdFusion中使用它,它們都在同一個會話下。 OnSessionStart只會在這種情況下發生一次,而不是兩次。因此,如果用戶結構不存在,則無論是否啓動超級拱形會話,都要重新創建用戶結構。 – 2011-05-18 12:49:31

5

配置和使用會話變量的基礎知識是explained here

會話基本上是客戶端和應用程序之間的邏輯關係,所以會話變量可從客戶端的第一個請求到達您的應用程序,並且會話通常使用cookie來持久化請求,該cookie使用唯一標識會話的cookie,儘管這也可以通過在URL中傳遞標識符來完成。值得關注會話超時設置,例如,您可能希望爲僵屍網絡/抓取工具提供更短的超時時間,因爲它們不會設置cookie,因此會爲每個頁面請求(more details on this)啓動一個新的會話。