2011-03-27 75 views
1

在Java Web應用程序中,Java servlet創建唯一的jsessionid,該cookie作爲cookie傳遞到客戶端瀏覽器,以跟蹤第一個請求之後的客戶端的後續請求。但是,當Cookie被禁用並且由於安全策略而不允許URL重寫時,我的理解是Java servlet會爲來自同一客戶端的每個請求創建一個新的會話對象。它是否正確?這是否意味着大量的服務器內存浪費(每個會話對象的內存分配過多,永遠不會再使用和過多的垃圾收集)?如何識別網站訪問者禁用cookie並禁止URL重寫?

一種解決方案是在這種情況下使用客戶端的IP地址和用戶代理字符串來唯一標識用戶並存儲在數據庫中。這是正確的解決方案?

以上情況在搜索引擎殭屍程序中相當常見,它們在訪問網站時通常會發出數千次頻繁的請求。

任何其他想法爲基於Java的Web應用程序的這個問題制定適當的解決方案?

回答

3

是的,在這種情況下,每次都會創建會話。這些確實會花費內存並最終需要GC'ed。

如果您不需要跟蹤用戶,您可以隨時選擇禁用會話創建。在JSP中,這有點困難,因爲頁面通常會創建一個會話。有一個指令可以關閉此功能。

然而,您可以編寫一個過濾器和servlet請求包裝器,以防止創建會話。

在JSF中,大量使用的Mojorra 2.04實現中存在一個非常不幸的錯誤,這使得它或多或少無法做到這一點,但幸運的是Mojarra 2.1.0已經解決了這個問題。

如果您確實需要跟蹤用戶,可以使用指紋形式。這總是近似的,我認爲你不應該使用這個登錄。 IP +用戶代理是指紋識別的一種形式,但由於代理和大型組織爲其所有工作站安裝完全相同的瀏覽器,因此這是相當不可靠的。使用統計信息沒問題,但完全不適合登錄。

替代品正在使用HTTPS/SSL,因爲此協議具有內置類型的「會話ID」,或者使用DOM或Flash存儲器,並非禁用所有禁用Cookie的人都會禁用。

+1

很好的答案。我會加上一個壓力:你不能通過IP + USER_AGENT來識別某人。 – 2011-03-27 11:27:19

相關問題