Servlets: ¿Cuándo debemos usar request y cuándo debemos usar session mientras desarrollamos una aplicación web multiusuario?

La pregunta tiene que ver con el alcance y el estado y el acoplamiento y la cohesión. Tienes que entender los fundamentos para entender esto correctamente.


Vayamos un poco a la vieja escuela aquí y olvidemos los servlets por un tiempo, y consideremos los fundamentos. Cuando diseña software, desea diseñarlo para lograr flexibilidad y facilidad de mantenimiento. La forma de maximizar la flexibilidad y la capacidad de mantenimiento es tener una alta cohesión y un bajo acoplamiento. La alta cohesión es que un módulo hace una cosa y hace una cosa bien. El acoplamiento bajo significa que un módulo no depende de otros módulos para hacer lo que necesita hacer. Si tiene un módulo altamente cohesivo y de bajo acoplamiento, puede tomarlo y colocarlo en cualquier aplicación. Se convierte en bloque de construcción

Ahora, hay diferentes cosas que afectan la cohesión / acoplamiento, y una de ellas es cómo pasar los datos a sus módulos. Pasar un parámetro de entrada es mejor que pasar datos a través de una variable global

función foo ()
{
bar (3)
}
barra de funciones (int a)
{
// utilizar una
}

es mejor que

int a;
función foo ()
{
a = 3;
bar();
}
barra de funciones (int a)
{
// utilizar una
}

porque en la segunda versión ambas funciones dependen de esta variable global, y la barra no es autónoma. No puedes dejarlo caer en otro lugar. Una vez que comienza a ingresar en cientos de tales variables distribuidas en miles de funciones, ingresa al código sphagetti si usa la variable global

Por supuesto, hay algunas ventajas al usar variables globales. Mejoran la eficiencia, por un lado. No tiene que seguir pasando datos de un lado a otro (especialmente si la llamada de foo a bar requiere un viaje de ida y vuelta a la red). Además, podría simplificar el código. Digamos que bar estaba llamando a otra función dodo que necesitaba la variable a, usted no necesita la barra para pasar la variable a dodo.

Entonces, es una compensación, y la forma de resolver la compensación es considerando el alcance de la variable desde el punto de vista comercial. Si la variable contiene un estado que debe compartirse globalmente, entonces se convierte en una variable global. Si el estado de los datos en la variable está vinculado a esta operación, entonces lo convierte en un parámetro


Entonces, ¿cómo se aplica todo esto a los servlets? La pregunta es de alcance. Si el estado de una variable en particular está vinculado a la sesión, póngalo en sesión. Si solo está vinculado a esta solicitud, póngalo en la solicitud. Entonces, por ejemplo, si la variable almacena el ID de usuario del usuario actualmente conectado, sabrá que se mantendrá constante durante la sesión. Entonces, ponlo en sesión. Supongamos que el usuario hace clic en un enlace para mirar un elemento, la identificación del elemento solo es válida para esta solicitud, por lo que debe ser una variable de solicitud. Si coloca la identificación de usuario en la solicitud, tendrá que pasar la misma identificación de usuario a cada enlace, lo que agregará complicaciones y sobrecarga. Si pasa itemid como variable de sesión, entonces reduce la cohesión porque su servlet depende de esta variable de sesión

Las sesiones crean una sobrecarga en el backend. Esto obliga a las aplicaciones a mantener el estado . Esto incurre sustancialmente en una penalización de rendimiento cuando intentas construir una aplicación escalable. Esto se debe a que cada par de solicitud / respuesta ya no es atómico si depende de una sesión.

Por lo general, se trata de diseñar aplicaciones altamente escalables para que sean lo más atómicas posible para mejorar la escala. Por lo tanto, trate de evitar sesiones si no son explícitamente necesarias.

En los servlets, el alcance de la solicitud es la vida útil de la solicitud y respuesta HTTP. Los parámetros de solicitud en la URL se adjuntan a esto, en HttpServletRequest . Los atributos también se pueden establecer y llegar aquí: son como un Map , pero solo existen hasta durante la vigencia de la solicitud. Tenga cuidado de que cualquier “variable de instancia” que se establezca en una solicitud se almacene en los atributos de la solicitud. Las variables de instancia de la clase no se pueden usar porque el contenedor de servlet puede y reutilizará la misma instancia de la clase para múltiples solicitudes. Este es uno de los factores motivadores detrás de los marcos que hacen uso de POJO que están desacoplados de los servlets.

El alcance de la sesión es la vida útil de la sesión de un usuario. Se crea desde dentro de HttpSerlvetRequest , usando getSession() . A diferencia de otras plataformas como PHP o Ruby on Rails, el almacenamiento de sesión, conocido como atributos de sesión en servidores, no se almacena en cookies. En cambio, se almacenan en el lado del servidor y se realiza un seguimiento utilizando JSESSIONID que generalmente es una cookie, pero también podría agregarse a la URL si el usuario deshabilita las cookies. Con las sesiones, las solicitudes múltiples donde el navegador presenta el mismo JSESSIONID compartirán los mismos atributos.

Por lo tanto, cuándo “deberían” ser utilizados depende del diseño de la aplicación: cuánto tiempo se guarda la información.

Por lo tanto, los datos de la solicitud se envían a través del protocolo http y deben propagarse en cada solicitud. La sesión se asigna a un solo usuario y permanece en la memoria del servidor, la base de datos o las cookies.

Utilizará ambos en una aplicación web, pero recuerde que si usa cookies, puede usar solo 4Kb de datos. En el servidor puede almacenar más datos, pero recuerde que si tiene muchos usuarios, podemos manejar muchos datos y comprometer el rendimiento de su servidor o base de datos.

De todos modos, trate de ser económico cuando use la sesión.

En estos días con una mayor capacidad de procesamiento del navegador, no debe almacenar nada excepto JSESSIONID en la sesión. Con la aplicación de página única (SPA), donde toda la página se carga solo una vez que no necesita almacenar nada en la sesión. En general, piense mucho antes de usar una variable de sesión.

El objeto de sesión debe mantenerse ligero como si contuviera más datos / valores, más tiempo tomará la aplicación mientras navega / procesa. Esto se debe a que el alcance de la sesión es más de una página, donde, como en el caso del objeto Solicitud, dura solo una Solicitud / Respuesta HTTP.

No importa qué marco se use, la sesión siempre es costosa que el objeto de solicitud / respuesta. La sesión solo debe usarse después de analizar los requisitos correctamente.

More Interesting

¿Por qué alguien hizo clic en cada página de mi sitio web?

¿Cuál es un buen servicio de alojamiento java? No podemos recurrir a los servicios en la nube, ya que son caros.

¿Qué tecnología es mejor para desarrollar aplicaciones web php o asp.net?

¿Cuál es el futuro de la gamificación de aplicaciones web?

¿Cómo se implementan los diferentes tipos de software y aplicaciones web y cuáles son las herramientas que se utilizan?

¿Cuáles son los pasos técnicos exactos de un usuario que interactúa con una aplicación web? (Preferiblemente usando el marco Flask).

¿Crees que AngularJS es el futuro del desarrollo web?

¿Cuáles son las herramientas de desarrollo web gratuitas más fáciles?

¿Existe un IDE que le permita crear aplicaciones de una sola página utilizando un editor WYSIWYG?

¿Cuál es el mejor marco web para hacer algunas aplicaciones web de compras en línea teniendo en cuenta el tráfico más la seguridad? Recomendación de servicio de alojamiento es una ventaja?

¿Cuál es el marco web más agradable para proyectos medianos?

Cómo comenzar el desarrollo de aplicaciones web

¿Cuándo debo usar la Aplicación de página única (SPA) y cuándo debo usar la Aplicación de página múltiple (MPA)?

Como programador de 'nivel intermedio' que solo trabaja en el backend de la aplicación web de una startup, ¿qué tan preocupado debería estar por las lagunas de seguridad que podría estar creando involuntariamente, incluso si soy capaz de acelerar las cosas rápidamente?

¿Qué framework / pila de software es el mejor para desarrollar una aplicación web rápida y altamente receptiva compuesta por unas pocas pantallas de selecciones de menú desplegable?