最近須要學習並用CodeIgniter框架對一個項目進行二次開發,因爲以前一直都是使用Symfony作項目,因此再換到CodeIgniter項目上仍是比較順暢的。不過相比較之下,感受CodeIgniter比Symfony要輕量不少,固然這不是本文的討論點。接下來會將我遇到的問題描述出來並給出最終的解決方案,但願能幫助到和我遇到一樣問題的朋友。php
在項目開發中須要用到文件上傳的功能,這邊前端是使用uploadify來實現文件上傳功能的。在firefox完成這個功能的實現,測試並無問題一切正常。但是在 IE 下的時候,頭疼的問題就來了。文件上傳成功以後,用戶會話卻丟失了。致使用戶需再次登陸,而且上一步的後續操做也沒有執行(由於有權限驗證,會話丟失以後驗證不經過形成的)。網上搜索的結果大體都是firefox, chrome 下使用uploadify時使用了flash插件,flash中有個bug就是自身會建立一個session,這樣就致使與web自己的session不一致,致使服務端權限驗證失敗的問題。但是我在firefox和chrome下是能夠正常使用並無出錯,出錯的反而是在 IE。前端
後來通過一番分析找到緣由了,首先CodeIgniter框架中session使用的不是php原生的session機制而是本身的一套東西,CodeIgniter會把session保存到Cookie中,這個Cookie數組中保存的session_id也不是php 原生的session_id ,而是經過本身的規則生成的(這裏也就能說明爲何我在firefox、chrome中不會由於session_id丟失會話的緣由)。CodeIgniter session類相關代碼截圖以下:web
其次是由於諸如uploadify,swfupload採用的都是flash客戶端,這樣它們產生的user-agent與用戶使用瀏覽器的 user-agent必然不一樣。並且CodeIgniter在驗證會話時也會將user-agent做爲判斷條件。若是user-agent不一致,CodeIgniter會將當前的session會話銷燬,並從新生成會話,這就致使以前用戶登陸的會話丟失狀況。因此當用戶登陸了你的系統產生了一個session,可是當觸發上傳程序時會產生另外一個session(在上述 user-agent選項開啓的狀況下)。再進一步分析發現,IE下觸發上傳程序flash產生的user-agent 既然是「Shockwave Flash」錯誤,一開始覺得是IE 下的flash版本太低致使的,後來flash升級 IE重啓仍是不行,依然出現「Shockwave Flash」這個錯誤。chrome
既然升級flash無果,咱們就想辦法讓服務器在session判空以前將flash產生的user-agent hack掉,跳過驗證便可。相關代碼截圖以下:數組
最後不難發現形成IE 下 CodeIgniter + uploadify 出現會話丟失的根本緣由,是flash插件產生的user-agent與用戶使用的瀏覽器user-agent不一樣致使CodeIgniter在驗證時不經過至此出現用戶會話丟失的現象。瀏覽器