2011-04-01 150 views
54

我在想,當你想設置如下頁面指令在JSP:爲什麼設置JSP頁面session =「false」指令?

<%@ page session="false" %>

我知道,它可以防止會話對象的創建,但是當你需要做的是什麼?當JSP不需要訪問隱式會話時,它被認爲是最佳實踐嗎?

注意爲什麼我想問的原因,是因爲它是在這個Spring MVC的教程中,我以爲SpringSource的人知道自己的東西 - http://blog.springsource.com/2011/01/04/green-beans-getting-started-with-spring-mvc/

回答

75

其中一個原因是性能內存。如果您的頁面不需要參與會話(例如about.jspfaq.jsp),那麼涉及會話中每個JSP的默認行爲將強加創建新會話對象的開銷(如果其中一個不會已經存在)以及隨着更多對象駐留在堆上而增加的內存使用量。

如果單個頁面看到來自許多獨特用戶的高流量並伴有高跳出率,即他們的用戶不會繼續瀏覽但在查看該頁面之後立即離開網站 - 容器,則此效果將大大地誇大會爲每個用戶創建一個新的會話對象,永遠不會再使用它,並在超時後最終被垃圾收集 - 在對象創建,內存使用和垃圾收集的頭上添加,而不會給你任何實際價值。

+4

我真的很喜歡學習小型的性能技巧,他們可以添加大事情。謝謝! – 2011-04-01 18:14:14

+4

此外,可以將會話寫入持久性存儲以用於容錯設置中的應用程序服務器,因此指定頁面不使用會話(具體而言,不會創建會話,因爲提問者暗示)會避免I/O與持久存儲進行交互的開銷。 – Will 2011-10-21 09:19:37

+0

令人驚歎的解釋! – Oliver 2014-08-20 09:38:30

17

這個設置也是一個安全措施,因爲它也可以避免潛在的攻擊DoS。考慮一個簡單的腳本,該腳本可以迭代地使用wgets JSP:它會在幾秒鐘內生成很多會話。

5

實際上,我的應用程序中有一個真實的場景供其使用。我們的Squid在我們的應用程序前充當反向代理。 squid服務器設置爲輪詢託管我們應用程序的所有tomcat實例,以驗證服務器是否已啓動並正在運行(如果沒有),Squid將故障切換到在集羣中使用另一臺服務器。

從Squid到我們的應用程序的實際輪詢被設置爲輪詢應用程序中的特定頁面。由於Squid的輪詢實際上並不是一個瀏覽器,它不能持有會話,這意味着每次對服務器頁面的輪詢都會讓tomcat創建一個Squid無法引用的會話。我們添加<%@ page session="false" %>指令,以便在每次輪詢時不會創建會話。如果我們沒有使用這個指令,我們將會有超過4小時的時間創建數以千計的會話。

0

實際上需要添加此指令的另一個用例是在.ini配置文件中使用Apache Shiro的noSessionCreation過濾器,例如,因爲你的認證方案是無狀態的。如果你缺少它,你會遇到org.apache.shiro.subject.support.DisabledSessionException

相關問題