2012-02-20 19 views
0

我正在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的寫入日期提前一年。

+0

我有答案......我會在愚蠢的8小時自我回答限制結束後發佈它。 – scippie 2012-02-20 13:55:02

回答

0

我已經找到了問題所在,我的設想是在不指定路徑的情況下設置cookie會導致會話在該域上的所有路徑上工作。 通過使用http://foo.bar/home作爲主頁,http://foo.bar/home/css作爲樣式表,內部翻譯該網址爲?s1 = home和?s1 =家& css = y,我實際上使用兩個不同的路徑根據瀏覽器沒有通過cookie到CSS請求。

出於某種原因,事後他們真的聚在一起,我不完全明白爲什麼。

這不傻嗎?人們不會經常有http://foo.bar/index.phphttp://foo.bar/css/style.css.php,僅僅因爲他們使用子目錄來保持其結構清潔?

如果有人知道修復它的方法,爲了使子路徑也可以使用相同的cookie,請告訴我,但根據我對cookies的定義瞭解,它們被困在特定路徑中(儘管它似乎如果你專門添加一個路徑而不是/,它也可以在子目錄上工作嗎?)

相關問題