servlets - mismo - que es un servlet y para que sirve
¿Por qué los servlets no son seguros? (6)
Necesito saber por qué los servlets no son seguros para subprocesos?
Las instancias de servlet no son intrínsecamente seguras para subprocesos debido a la naturaleza de múltiples subprocesos del lenguaje de programación Java en general. Java Virtual Machine admite la ejecución del mismo código por varios hilos. Este es un gran beneficio de rendimiento en máquinas que tienen múltiples procesadores. Esto también permite que varios usuarios simultáneos ejecuten el mismo código sin bloquearse entre sí.
Imagine un servidor con 4 procesadores en el que un servlet normal puede manejar 1000 solicitudes por segundo. Si ese servlet fuera enhebrable, entonces la aplicación web actuaría como si se ejecutara en un servidor con 1 procesador, en donde el servlet solo puede manejar 250 solicitudes por segundo (está bien, no es exactamente así, pero se entendió la idea).
Si encuentra problemas de seguridad al utilizar servlets, es su culpa, no de Java ni de Servlet. Debería corregir el código del servlet de forma tal que la petición o los datos del ámbito de la sesión nunca se asignen como una variable de instancia del servlet. Para una explicación más detallada, consulte también ¿Cómo funcionan los servlets? Instanciación, sesiones, variables compartidas y multihebra .
¿Y cuál es la razón por la que en el servlet del controlador de estructura Struts 2.0 es seguro para subprocesos?
No es seguro para subprocesos. Está confundiendo el filtro de servlet del distribuidor de Struts con las acciones de Struts. Las acciones de struts se vuelven a crear en cada solicitud. Por lo tanto, cada solicitud tiene su propia instancia de la acción de Struts con ámbito de solicitud. El filtro de servlet del distribuidor de Struts no los almacena como su propia variable de instancia. En cambio, lo almacena como un atributo de HttpServletRequest
.
Esta pregunta ya tiene una respuesta aquí:
Necesito saber por qué los servlets no son seguros para subprocesos? ¿Y cuál es la razón por la que en el servlet del controlador de estructura Struts 2.0 es seguro para subprocesos?
El servlet no es seguro para subprocesos, pero podemos hacerlo como un subproceso seguro al implementar esa clase de servlet en SingleThreadModel
como la definición de clase indicada a continuación, pero nuevamente el problema de rendimiento estará allí, por lo que sería mejor utilizar la porción sincronizada.
public class SurveyServlet extends HttpServlet
implements SingleThreadModel
{
servlet code here..
...
}
Hay una sola instancia de un servlet por mapeo de servlet; todas las propiedades de instancia se comparten entre todas las solicitudes. El acceso a esas propiedades debe tenerlo en cuenta.
Las acciones Struts 2 (no el "servlet del controlador", no son ni servlets ni controladores) se instancian por solicitud. Solo se accederá a las propiedades de acción mediante un solo hilo de solicitud.
Los servlets son clases normales de Java y, por lo tanto, NO son seguros para subprocesos.
Pero dicho esto, las clases de Java son seguras para Thread si no tienes variables de instancia. Solo las variables de instancia necesitan sincronizarse. (Las variables de instancia son variables declaradas en la clase y no dentro de sus métodos.
Las variables declaradas en los métodos son seguras para hilos ya que cada hilo crea su propia pila de programas y las variables de función se asignan en la pila. Esto significa que las variables en un método se crean para cada subproceso, por lo tanto, no tiene problemas de sincronización de subprocesos asociados.
Las variables de método son seguras para subprocesos, las variables de clase no lo son.
Los servlets son normalmente de subprocesos múltiples.
Los contenedores de servlets generalmente administran solicitudes concurrentes creando un nuevo hilo Java para cada solicitud. El nuevo subproceso recibe una referencia de objeto al servlet solicitado, que emite la respuesta a través del mismo subproceso. Esta es la razón por la cual es importante diseñar la simultaneidad cuando se escribe un servlet, porque múltiples solicitudes pueden ser manejadas por la misma instancia de servlet.
La forma en que los contenedores de servlet manejan las solicitudes de servlets depende de la implementación; pueden usar un solo servlet, pueden usar la agrupación de servlets, depende de la arquitectura del sistema del proveedor.
Los objetos de acción de Struts 2 se instancian para cada solicitud, por lo que no hay problemas de seguridad de subprocesos.
Servlet no es seguro para subprocesos por sí mismo. Puede hacerlo seguro para hilos haciendo que el método de servicio esté sincronizado. necesita implementar SingleThreadInterface para que sea seguro para subprocesos.