我正在C++中創建自己的(多線程)基於ISAPI的網站,並試圖實現正確的會話管理。在同一頁面的後續請求中處理Cookie
問題是,當創建新會話時,在生成的網頁中使用後續請求時會創建兩次會話。
以下是它的工作方式: - 客戶端請求http://localhost,併發送無cookie或cookie的舊會話ID。 - 服務器查看會話cookie,並認爲需要創建一個新的會話cookie,因爲它不再存在:它準備一個帶有cookie的頭部,並帶有一個新的會話ID並將完整的頭部發送到客戶端(我跟蹤了這個在Firefox中使用http live header插件,這是正確的)。它還準備了一些數據,如頁面和類似的東西(不是正文數據,因爲它仍在處理來自數據庫的數據和類似的東西),並將它返回給客戶端。 - 客戶端現在應該有這個新會話cookie,並看到樣式錶鏈接,並立即將樣式表請求http://localhost/css發送到我的服務器。但是......他仍舊以舊會話ID出於某種原因這樣做,而不是新收到的ID! - 服務器看到這個請求(再次不再存在會話ID),產生另一個新的會話,併發送新的會話ID和一個cookie以及樣式表數據。
所以客戶端已經接收兩屆的現在和意志ID從現在開始繼續使用作爲第一個被覆蓋第二個,但仍然在第一頁使用了錯誤的會話(或實際上,第二頁有)。
您可以說這不是問題,但是當我開始使用個性化樣式表時,第一頁上會出現錯誤的樣式表,並且頁面將使用AJAX刷新內容(如果有的話),它是除非客戶端刷新,否則樣式表從不會重新加載。
那麼,這是一個在做這種事情時總是存在的問題嗎?瀏覽器是否總是發送一箇舊的cookie,雖然它已經收到一個新的cookie,但仍在處理該頁面?這是一個問題,例如PHP,也有?注意:在所有的討論開始之前關於「使用PHP代替」或者什麼的之前:我正在重寫一個我最初用PHP編寫的網站,它變得流行起來,每小時都有成千上萬的(真正的)訪問者,並開始殺死我服務器(該網站並沒有賺到這樣的錢,我可以扔很多服務器)。通過在C++中編寫它,請求在PHP中需要2ms而不是200ms ...我可以優化所有內容。通過花時間正確地開發這個ISAPI,它可以安全地進行多線程處理,並且可以進行多處理,多重處理。最重要的是,我喜歡這個挑戰。
補充說明:似乎問題只存在於cookie中存在舊會話時,因爲當我從瀏覽器中完全清除所有cookie,並且創建新的cookie並將其發送回客戶端時,隨後的樣式表請求立即使用給定的會話ID。這似乎是某種證據,表明我在發送舊會話ID時做錯了事情......應該先刪除現有Cookie嗎?怎麼樣?
補充說明:該cookie的寫入日期提前一年。
我有答案......我會在愚蠢的8小時自我回答限制結束後發佈它。 – scippie 2012-02-20 13:55:02