我想知道你什么时候想要在JSP中设置以下页面指令:
<%@ page session="false" %>
我知道它会阻止创建会话对象,但是什么时候需要这样做呢?当JSP不需要访问隐式会话时,它被认为是最佳实践吗?
注意:我问的原因是因为它出现在这个Spring MVC教程中,我认为springource的人知道他们的东西 - http://blog.springsource.com/2011/01/04/green-beans-getting-started-with-spring-mvc/ < / p>
答案 0 :(得分:82)
一个原因是性能和内存。如果您有一个不需要参与会话的页面(例如,about.jsp
或faq.jsp
),那么在会话中涉及每个JSP的默认行为将会产生创建的开销新的会话对象(如果尚未存在)和增加的内存使用量,因为更多的对象驻留在堆上。
如果单个页面看到来自许多独特用户的高流量并且具有高跳出率,即用户不会继续浏览但在查看该页面后立即离开该网站,则该效果会被夸大。为每个用户创建一个新的会话对象,永远不会再次使用,最终会在超时后进行垃圾收集 - 添加对象创建,内存使用和垃圾收集,而不会给你任何实际价值。
答案 1 :(得分:19)
答案 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不使用会话让我们解决了这个问题。