2011-04-01 7 views
54

Me preguntaba cuando se desea establecer la siguiente directiva de página en un JSP:¿Por qué configurar una sesión de página JSP = directiva "falsa"?

<%@ page session="false" %>

sé que impide la creación del objeto de sesión, pero cuando se necesita para hacer eso? ¿Se considera una mejor práctica cuando un JSP no necesita acceder a la sesión implícita?

NOTA: La razón por la que pido, es porque fue en este tutorial Spring MVC y supongo que la gente SpringSource saben lo que hacen-http://blog.springsource.com/2011/01/04/green-beans-getting-started-with-spring-mvc/

Respuesta

75

Una de las razones sería rendimiento y memoria. Si tiene una página que no necesita estar involucrada en una sesión (por ejemplo, about.jsp o faq.jsp), el comportamiento predeterminado de involucrar a cada JSP en una sesión impondrá la sobrecarga de crear un nuevo objeto de sesión (si no lo hace) ya existe) y un mayor uso de memoria a medida que más objetos residen en el montón.

Este efecto será muy exagerado si una sola página ve mucho tráfico de muchos usuarios únicos combinado con una alta tasa de rebote, es decir, los usuarios no continúan navegando pero abandonan el sitio inmediatamente después de ver esa página: el contenedor creará un nuevo objeto de sesión por usuario que nunca volverá a usarse y, en última instancia, se recolectará basura después de que se agote el tiempo de espera; se agregará la creación de objetos, el uso de memoria y la recolección de basura sin darle ningún valor real.

+4

Realmente disfruto aprendiendo los pequeños consejos de rendimiento, pueden agregar grandes cosas. ¡Gracias! –

+4

Además, la sesión puede escribirse en una tienda persistente para servidores de aplicaciones en una configuración tolerante a errores, por lo que especificar que una página no utiliza una sesión (no específicamente no crea una sesión como lo implica el consultante) evita la I/O por encima de interactuar con la tienda persistente. – Will

+0

¡Explicación asombrosa !! – Oliver

17

Esta configuración es también una medida de seguridad, ya que también evita un posible ataque DoS. Piense en un script simple que iterativamente wgets el JSP: generará muchas sesiones en pocos segundos.

5

De hecho, tengo un escenario real en mi aplicación para su uso. Tenemos Squid actuando como un proxy inverso en frente de nuestra aplicación. El servidor de Squid está configurado para sondear todas las instancias de tomcat que alojan nuestra aplicación para verificar que los servidores estén activos y funcionando; de lo contrario, Squid pasará a utilizar otro servidor en nuestro clúster.

La encuesta real a nuestra aplicación de Squid está configurada para sondear una página específica en la aplicación. Dado que la encuesta de Squid no es en realidad un navegador, no puede contener una sesión, lo que significa que cada encuesta a la página del servidor haría que tomcat creara una sesión a la que Squid no puede mantener una referencia. Agregamos la directiva <%@ page session="false" %> para que no se cree una sesión en cada encuesta. Si no usamos esta directiva, tendremos miles de sesiones creadas durante 4 horas sin ningún motivo.

0

Otro caso de uso en el que en realidad se requiere agregar esta directiva es cuando se usa el filtro noSessionCreation de Apache Shiro en el archivo de configuración .ini, p. porque su esquema de autenticación es sin estado. Si le falta, se encontrará con un org.apache.shiro.subject.support.DisabledSessionException.

Cuestiones relacionadas