Si está almacenando el estado en el servidor que se necesita para procesar una solicitud entrante del cliente, entonces el servidor tiene estado. Dicho de otra manera, ha declarado que almacena y necesita acceder para procesar las solicitudes de los clientes. Entonces, su hashmap es estado, por lo que su servidor tiene estado.
Ahora, hay muy pocas aplicaciones web reales que hagan cosas ricas que no tengan estado en absoluto. Después de todo, si va a tener un inicio de sesión de usuario y luego procesar solicitudes a instancias de un cliente conectado, entonces, por definición, está almacenando el estado en el servidor que pertenece a un cliente en particular y el servidor tiene estado , aunque solo sea para la información de inicio de sesión.
Por lo tanto, no me obsesionaría demasiado con que haya un estado cero en el servidor. Lo que importa es cuánto estado hay en el servidor, qué tan costoso (en términos de procesamiento, almacenamiento, etc.) es almacenar y acceder a este estado y aún puede escalar su aplicación horizontalmente con este estado. Y, siempre que sea práctico, mantenga el estado en el cliente, no en el servidor. Como ejemplo trivial, suponga que tiene una aplicación cliente que tiene un botón de "página siguiente". Puede implementar la "página siguiente" con el estado del lado del cliente o del lado del servidor.
Si tenía el estado del lado del servidor para la página actual del cliente, podría enviar un comando al servidor que le gustaría ver la página "siguiente". El servidor miraría su estado para ese cliente, incrementaría la página y luego devolvería los datos para la página siguiente.
O bien, puede almacenar la página actual en el cliente. Cuando el cliente desea la siguiente página, toma su número de página actual, la incrementa en uno y realiza una solicitud genérica para el número de página específico que desea ver a continuación.
¿Cuál de estas implementaciones crees que escala mejor? ¿Qué es más sencillo de implementar cuando el usuario abre una segunda pestaña para ver una página diferente? Lo cual es más sencillo de escalar horizontalmente. La respuesta a todas esas preguntas es la que no almacena la página actual en el servidor, sino que la mantiene en el cliente y solo realiza solicitudes genéricas para la página N al servidor. Mantener ese estado del lado del cliente hace que sea más fácil escalar individualmente y horizontalmente y admite múltiples vistas para el mismo cliente.