我知道它会阻止会话对象的创建,但是你什么时候需要这样做呢?当 JSP 不需要访问隐式会话时,它是否被认为是最佳实践?注意:我之所以问,是因为它是在这个 Spring MVC 教程中,我假设 springsource 的人知道他们的东西 - http://blog.springsour......" /> 我知道它会阻止会话对象的创建,但是你什么时候需要这样做呢?当 JSP 不需要访问隐式会话时,它是否被认为是最佳实践?注意:我之所以问,是因为它是在这个 Spring MVC 教程中,我假设 springsource 的人知道他们的东西 - http://blog.springsour......"> 我知道它会阻止会话对象的创建,但是你什么时候需要这样做呢?当 JSP 不需要访问隐式会话时,它是否被认为是最佳实践?注意:我之所以问,是因为它是在这个 Spring MVC 教程中,我假设 springsource 的人知道他们的东西 - http://blog.springsour......" />
我想知道您何时想要在 JSP 中设置以下页面指令:
<%@ page session="false" %>
我知道它会阻止会话对象的创建,但是你什么时候需要这样做呢?当 JSP 不需要访问隐式会话时,它是否被认为是最佳实践?
注意:我之所以问,是因为它是在这个 Spring MVC 教程中,我假设 springsource 的人知道他们的东西 - http://blog.springsource.com/2011/01/04/green-beans-getting-started-with-spring-mvc/
原因之一是性能和内存。如果您有一个不需要参与会话的页面(例如,about.jsp
或 faq.jsp
),那么让每个 JSP 参与会话的默认行为将产生创建新会话对象的开销(如果尚不存在)并随着更多对象驻留在堆上而增加内存使用量。
如果单个页面看到来自许多唯一用户的高流量以及高跳出率,则这种效果将被大大夸大,即他们的用户不会继续浏览,而是在查看该页面后立即离开站点 - 容器将创建一个新的每个用户的会话对象永远不会被再次使用,并且在超时后最终将被垃圾收集 - 添加在对象创建、内存使用和垃圾收集的头上,而不会给您任何真正的价值。
实际上,我的应用程序中有一个真实的场景供其使用。我们让 Squid 在我们的应用程序前充当反向代理。 squid 服务器设置为轮询托管我们应用程序的所有 tomcat 实例,以验证服务器是否启动并运行,如果它们不是,Squid 将故障转移到使用我们集群中的另一台服务器。
Squid 对我们应用程序的实际轮询设置为轮询应用程序中的特定页面。由于 Squid 的轮询实际上不是浏览器,它不能保持会话,这意味着对服务器页面的每次轮询都会让 tomcat 创建一个 Squid 无法保持引用的会话。我们添加了 <%@ page session="false" %>
指令,以便不会在每次投票时创建会话。如果我们不使用此指令,我们将在 4 小时内无缘无故地创建数千个会话。
另一个实际需要添加此指令的用例是在 .ini
配置文件中使用 Apache Shiro 的 noSessionCreation
过滤器时,例如因为您的身份验证方案是无状态的。如果缺少它,您将遇到 org.apache.shiro.subject.support.DisabledSessionException
。
在我的生产应用程序中遇到另一个用例,我想我会在这里分享它以防它帮助某人。
我们有一个通过会话保护大多数资源的 Web UI 应用程序。但是,在我们的生产部署中,一些资源受到位于我们应用程序前面的部分 Web 层的保护。因此,就应用程序而言,这些资源是完全不受保护的。其中一些“不受保护”的资源是 JSP。
如果用户在我们的受保护资源之一上建立会话,然后从浏览器对“未受保护”资源之一进行 XHR 调用,我们遇到了一个问题,即容器声称匿名用户正在尝试访问用户 foo 的会话,从而停止执行。将“不受保护的”JSP 配置为不使用会话让我们解决了这个问题。