2011-12-20 40 views
1

我有一個使用Stripes和Apache Shiro庫進行安全性的web應用程序。Tomcat爲同一會話創建新線程

在我的本地Windows Tomcat 6.0.33安裝一切工作正常。但是,當我在主機DailyRazor上的Linux上的Tomcat 6.0.16上運行應用程序時,我可以看到週期性的Tomcat正在爲同一用戶/會話產生一個新線程,因此用戶正在丟失其憑據並被要求登錄再次。

在Jetty下運行時,我也注意到了這個問題。

我不認爲這是一個不活動的超時問題,因爲我給webapp的命中是順序的,除了不同的小版本之外,Tomcat配置中是否有其他可能不同的東西?

另外,是否有一個簡單的方法來調試會話信息(因爲它沒有出現在我的網址)?

+0

它是否在請求處理中啓動一個新線程?或者它啓動一個新的線程來處理新的請求。如果後者,這是可以預料的。你是否將憑據存儲在ThreadLocal中,並希望它始終使用同一個線程進行會話? – 2011-12-20 12:20:22

+0

您可以通過正常記錄轉儲會話ID - 但是您說您已經知道它是同一會話,您怎麼知道這一點?用戶的會話可以跨任意數量的線程存在。 – 2011-12-20 12:33:49

+0

@JBNizet我在收到請求時進行日誌記錄,對於來自同一瀏覽器窗口的不同請求,這可能會有所不同。我相信Shiro將證書存儲在一個ThreadLocal中,因爲有一個靜態調用來獲取當前主題,我不能保證一個線程會與會話ID緊密相關嗎?......這樣說吧,我覺得像我一樣已經知道答案 – 2011-12-20 14:49:18

回答

3

只是爲了更清楚地比如果它是在一個註釋:每個HTTP請求將通過一個任意線程來處理。 Tomcat(和其他應用程序服務器)使用線程池,從池中選擇一個線程,執行請求並將線程返回給池。

HTTP會話與線程完全正交:來自同一會話的多個請求可能由不同的線程處理。線程執行來自多個會話的請求。通常比池中的線程多得多的並行會話。最後,你可能會有兩個線程爲同一個會話執行兩個請求。這意味着存儲在會話中的對象應該是線程安全的,或者應該使用同步機制來訪問存儲在會話中的非線程安全對象。此外,給定瀏覽器的多個框架或選項卡共享相同的HTTP會話。如果您啓動不同的瀏覽器(例如,除Firefox以外的Chrome),或者在另一臺計算機上使用瀏覽器,則會有不同的會話。

+0

我從你在評論中的評論中發現了這一點。如果我從這個問題上退後一步,看看有人會如何實現像Tomcat一樣的東西,那將是非常有意義的。感謝你的回答,我想我會把我的應用程序翻出來,並且使用Shiro servlet來保證安全性,然後弄清楚如何在其中嵌入條紋框架,而不是從條紋攔截器中調用Shiro。 – 2011-12-20 16:34:18