Servlet actuando como proxy: ¿Cómo reenviar la sesión?

No estoy muy seguro de la viabilidad del requisito que estoy tratando de lograr, pero así es como funciona:

  • He creado un Servlet que actúa como proxy. Recibe una llamada RESTful y luego invoca otro servicio RESTful en un servidor remoto (nodo).
  • El reenvío se realiza a través de HTTPClient y no con un despachador de solicitudes. Básicamente, emito una nueva solicitud HTTP al servidor remoto.
  • Cuando el primer servidor (servidor proxy) recibe la llamada, la solicitud (HttpServletRequest) tiene una sesión asociada. El isNew() propiedad de la HTTPSession Es falso.
  • Cuando se reenvía la llamada y el servidor remoto recibe la llamada, la sesión se convierte en una nueva.

Básicamente, estoy tratando de encontrar una manera de reenviar la sesión al servidor remoto también.

Ser más preciso: ¿Es posible simplemente obtener una sesión de un HttpServletRequest y colóquelo en una sesión de una solicitud HTTP recién creada (a través de HTTPClient)?

preguntado el 09 de marzo de 12 a las 23:03

3 Respuestas

Depende de cómo su WS remoto mantenga una sesión. Si, por ejemplo, usa cookies (Tomcat lo hace entre otras técnicas), entonces reenviar los encabezados entrantes debería ayudarlo a lograrlo (asegúrese de mencionar que acepta cookies, pero creo que HTTPClient lo hace de manera predeterminada). Ahora, si se basa en un parámetro en la URL, debe intentar reproducir ese comportamiento.

respondido 10 mar '12, 00:03

Si los dos nodos (proxy y servicio) son procesos separados que no forman parte de un clúster de aplicaciones, probablemente no lo sean.

El contenedor de servlet generalmente administra HttpSession. Si está reenviando una solicitud a otro servicio, alojado en un contenedor diferente, tendrá un objeto de sesión diferente.

Si los dos nodos forman parte de un clúster, normalmente la sesión se puede compartir entre los nodos del clúster a través de varios mecanismos (en la replicación de la memoria, la sincronización de la base de datos, etc.).

Otra opción es externalizar los datos de su sesión en algo como Redis, Memcached, Coherence, etc. Algunos servidores de aplicaciones tienen soporte conectable para dicho proceso. Creo que en este escenario los nodos del servidor de aplicaciones no necesariamente tendrían que ser parte de un clúster para compartir los datos de la sesión.

contestado el 03 de mayo de 12 a las 19:05

Me faltaban algunos de los fundamentos del manejo de sesiones cuando hice esta pregunta. Después de algunas investigaciones y discusiones, esto es lo que obtuve:

  • Básicamente, las sesiones son manejadas por un JSESSIONID variable.
  • JSESSIONID se crea automáticamente (se puede desactivar) cuando la solicitud llega al servidor.
  • Se envía de vuelta en el encabezado de respuesta.
  • La razón por la que el servidor remoto cree que es una nueva sesión es porque la solicitud no tiene este JSESSIONID conjunto.

  • El proxy hace lo siguiente para asegurarse de que la sesión se reenvía:

    1. Cuando llega la solicitud entrante; crear y almacenar el JSESSIONID.
    2. Emita una nueva solicitud al servidor remoto.
    3. Descomprima el encabezado de respuesta del servidor remoto y extraiga JSESSIONID.
    4. Mantener un mapeo del lado del cliente JSESSIONID y servidor remoto JSESSIONID.
    5. Para cualquiera de las siguientes solicitudes, utilice esta asignación para enviar solicitudes al servidor remoto.

Básicamente, el proxy hace el mapeo desde el lado del cliente JSESSIONID al servidor remoto JSESSIONID. De esta forma, la sesión se reenvía al servidor remoto.

contestado el 08 de mayo de 12 a las 02:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.