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

时间:2011-04-01 15:48:45

标签: jsp session

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

<%@ page session="false" %>

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

注意我问的原因是因为它出现在这个Spring MVC教程中,我认为springource的人知道他们的东西 - http://blog.springsource.com/2011/01/04/green-beans-getting-started-with-spring-mvc/ < / p>

5 个答案:

答案 0 :(得分:82)

一个原因是性能内存。如果您有一个不需要参与会话的页面(例如,about.jspfaq.jsp),那么在会话中涉及每个JSP的默认行为将会产生创建的开销新的会话对象(如果尚未存在)和增加的内存使用量,因为更多的对象驻留在堆上。

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

答案 1 :(得分:19)

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:0)

实际上需要添加此指令的另一个用例是在ProgrammingError: syntax error at or near "%" LINE 1: insert into Players values (%s); 配置文件中使用Apache Shiro的noSessionCreation过滤器,例如因为您的身份验证方案是无状态的。如果你缺少它,你会遇到.ini

答案 4 :(得分:0)

在我的生产应用程序中进入另一个用例,我想在这里分享它,以防它对某人有所帮助。

我们有一个Web UI应用程序,可通过会话保护大多数资源。但是,某些资源受到我们的生产部署中位于应用程序前面的Web层的一部分的保护。因此,就应用程序而言,这些资源完全不受保护。其中一些“未受保护”的资源是JSP。

如果用户在我们的某个受保护资源上建立会话,然后从浏览器向“未受保护”的资源之一进行XHR调用,我们就遇到了容器声称匿名用户是尝试访问用户 foo 的会话,从而停止执行。配置“不受保护的”JSP不使用会话让我们解决了这个问题。