2013-06-04 51 views
0

Dart HttpServer.listen返回一個HttpRequest。還有一個與服務器相關的超時控制HttpRequest保持活動狀態的時間。 HttpServer如何識別生成請求(用於檢索)的內容,以及它如何存儲請求,以及爲什麼要保存它們?HttpServer HttpRequest會話創建

在我遇到的情況下,從瀏覽器的不同選項卡頁面訪問同一臺服務器使用相同的服務器請求。如果使用不同的瀏覽器,則看起來會創建不同的請求。是否有可能強制服務器爲標籤頁創建不同的請求?

+0

你是在說要求還是你說的是會話? –

回答

0

我相信你的問題混合了請求和會話。如果我誤解了它,請忽略。

與HttpServer(我假設你的意思是HttpServer.sessionTimeout)相關的超時控制會話的生命週期,而不是請求。

會話基於cookie。服務器將會話標識符寫入cookie中。這個cookie然後用於瀏覽器和服務器之間的通信,所以服務器檢查cookie,爲您提供適當的會話使用。這是一個典型的實現,一些框架允許將整個會話存儲在cookie中,但這有許多缺點,我不會去討論。 Dart的HttpSession只是一個內存映射,它內部映射到會話cookie值。

由於瀏覽器選項卡(至少對於大多數瀏覽器而言,我不是這方面的專家)共享cookie,因此從任何選項卡對同一個域執行的請求將導致使用相同的會話。當然,另一個瀏覽器使用它自己的cookie存儲,所以你在那裏有不同的會話。

這個問題有時可以通過在URL中編碼會話ID來解決(Google針對'URL編碼的會話ID',因爲實現特定於所選後端),但我沒有看到任何支持的方法來將該方法插入HttpServer類。會話創建是在_HttpSessionManager類型中實現的,該類型對於dart:io庫是私有的,並且不提供任何公共擴展點,所以您很可能需要包裝自己的支持。

+0

感謝您的回答,我可能會根據您的說法混淆請求和會話。我剛剛開始考慮這個問題,因爲我正在做一個測試程序(變得更熟悉)以及意想不到的結果(對我來說)。結果與例如類似。當從另一個標籤訪問時,Gmail最初使我感到驚訝。但是,Yahoo Mail看起來行事不同,並創建了一個新的會話。 –

+0

那麼,雅虎郵件的行爲不同(對Gmail),但不會爲其出現的每個選項卡式頁面創建新會話。 –