为什么设置一个JSP页面session =“false”指令?

我想知道什么时候你想在JSP中设置下面的页面指令:

<%@ page session="false" %>

我知道它阻止了会话对象的创build,但是什么时候需要这样做呢? 当JSP不需要访问隐式会话时,是否被认为是最佳实践?

我之所以问,是因为这是在这个Spring MVC教程,我假设springource人们知道他们的东西 – http://blog.springsource.com/2011/01/04/green-beans-getting-started -with -弹簧- MVC /

原因之一是性能内存 。 如果你有一个不需要参与会话的页面(比如say, about.jsp或者faq.jsp ),那么涉及会话中每个JSP的默认行为将会增加创build新会话对象的开销(如果还不存在的话),并增加内存使用量,因为更多的对象驻留在堆上。

在单个页面看到来自许多独特用户的高stream量以及高跳出率的情况下,这种效果将被极大地夸大,即,用户不会继续浏览,而是在查看该页面之后立即离开网站 – 容器将创build新的每个用户的会话对象永远不会再被使用,并在超时后最终被垃圾收集 – 在对象创build,内存使用和垃圾收集的头上添加,而不会给你任何实际的价值。

这个设置也是一个安全措施,因为它也避免了潜在的DoS攻击。 想想一个简单的脚本,它可以迭代地运行 JSP:它会在几秒钟内生成很多会话。

实际上,我的应用程序中有一个真实的场景供其使用。 在我们的应用程序前面,我们有squid作为反向代理。 鱿鱼服务器设置为轮询所有的托pipe我们的应用程序的Tomcat实例,以validation服务器启动并运行,如果不是,Squid将故障转移到我们的集群中使用另一台服务器。

从鱿鱼到我们的应用程序的实际轮询被设置为轮询应用程序中的特定页面。 由于Squid的轮询实际上并不是一个浏览器,它不能持有一个会话,这意味着对服务器页面的每个轮询都会让tomcat创build一个Squid无法引用的会话。 我们添加<%@ page session="false" %>指令,以便每个轮询都不会创build一个会话。 如果我们没有使用这个指令,我们将会有超过4小时的时间创build数以千计的会话。

另外一个实际需要添加这个指令的用例是在.iniconfiguration文件中使用Apache Shiro的noSessionCreationfilter,例如,因为你的authenticationscheme是无状态的。 如果你缺less它,你会遇到一个org.apache.shiro.subject.support.DisabledSessionException