为什么设置JSP页面session ="false"指令?

Mik*_*e G 61 session jsp

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

<%@ page session="false" %>

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

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

no.*_*ing 84

一个原因是性能记忆.如果您有一个不需要参与会话的页面(比如说,about.jsp或者faq.jsp),那么在会话中涉及每个JSP的默认行为将会产生创建新会话对象的开销(如果没有已经存在)并且随着更多对象驻留在堆上而增加了内存使用量.

如果单个页面看到来自许多独特用户的高流量并且具有高跳出率,即用户不会继续浏览但在查看该页面后立即离开该站点,该效果将被夸大,该容器将创建新的每个用户的会话对象永远不会再次使用,最终会在超时后进行垃圾收集 - 添加对象创建,内存使用和垃圾收集,而不会给你任何实际价值.

  • 我真的很喜欢学习小的性能提示,他们可以加起来很大的东西.谢谢! (5认同)
  • 此外,可以在容错设置中将会话写入应用服务器的持久存储中,因此指定页面不使用会话(具体而言,不像提问者所暗示的那样创建会话)避免了I/O与持久性存储交互的开销. (4认同)

小智 21

此设置也是一种安全措施,因为它还可以避免潜在的DoS攻击.想想一个迭代地唤醒 JSP 的简单脚本:它会在几秒钟内生成大量会话.


Rei*_*ius 5

实际上我的应用程序中有一个真实的场景用于它的用法.在我们的应用程序面前,我们有Squid作为反向代理.squid服务器设置为轮询托管我们应用程序的所有tomcat实例,以验证服务器是否正常运行,如果不是,Squid将故障转移到我们集群中的另一台服务器.

从Squid到我们的应用程序的实际轮询设置为轮询应用程序中的特定页面.由于Squid的轮询实际上并不是一个浏览器,它不能持有一个会话,这意味着每次轮询到服务器页面都会有tomcat创建一个Squid无法持有引用的会话.我们添加<%@ page session="false" %>指令,以便不在每个轮询上创建会话.如果我们不使用此指令,我们将无缘无故地在4小时内创建数千个会话.