titledborder poner definicion borde java session java-ee servlets httpsession

poner - ¿Cómo puedo cargar manualmente una sesión Java usando un JSESSIONID?



set border java (5)

Esta es una muy buena publicación. Un problema potencial que veo al usar el oyente de la sesión para seguir agregando sesiones al contexto es que puede engordar bastante dependiendo de la cantidad de sesiones simultáneas que tenga. Y luego todo el trabajo adicional para la configuración del servidor web para el oyente.

Entonces, ¿qué tal esto para una solución mucho más simple? Implementé esto y funciona bastante bien. Por lo tanto, en la página que carga el objeto de carga de flash, almacene la sesión y sessionid como un par de clave-valor en el objeto de la aplicación y luego pase el ID de la sesión a la página de carga como un parámetro de publicación. En la página de carga, vea si ese sessionid ya está en la aplicación, es así que use esa sesión, de lo contrario, obtenga la de la solicitud. Además, continúe y elimine esa clave de la aplicación para mantener todo limpio.

En la página swf:

application.setAttribute(session.getId(), session);

Luego, en la página de carga:

String sessid = request.getAttribute("JSESSIONID"); HttpSession sess = application.getAttribute(sessid) == null ? request.getSession() : (HttpSession)application.getAttribute(sessid); application.removeAttribute(sessid);

Muy buena solución chicos. Gracias por esto.

Tengo un servlet que maneja una publicación de formulario multiparte. La publicación en realidad está siendo realizada por un componente de carga de archivos Flash incrustado en la página. En algunos navegadores, el POST generado por Flash no incluye el JSESSIONID, lo que me imposibilita cargar cierta información de la sesión durante la publicación.

El componente de carga de flash incluye cookies e información de sesión dentro de un campo de formulario especial. Usando este campo de formulario, puedo recuperar el valor de JSESSIONID. El problema es que no sé cómo usar este valor de JSESSIONID para cargar manualmente esa sesión específica.

Editar - Basado en la solución de ChssPly76, creé la siguiente implementación de HttpSessionListener :

@Override public void sessionCreated(final HttpSessionEvent se) { final HttpSession session = se.getSession(); final ServletContext context = session.getServletContext(); context.setAttribute(session.getId(), session); } @Override public void sessionDestroyed(final HttpSessionEvent se) { final HttpSession session = se.getSession(); final ServletContext context = session.getServletContext(); context.removeAttribute(session.getId()); }

Lo cual agrega todas las sesiones a ServletContext como atributos mapeados por sus identificadores únicos. Podría poner un Mapa de sesiones en el contexto, pero parece redundante. Por favor, publique cualquier pensamiento sobre esta decisión. A continuación, agrego el siguiente método a mi servlet para resolver la sesión por id:

private HttpSession getSession(final String sessionId) { final ServletContext context = getServletContext(); final HttpSession session = (HttpSession) context.getAttribute(sessionId); return session; }


No hay API para recuperar sesión por id.

Lo que sí puede hacer, sin embargo, es implementar un oyente de sesión en su aplicación web y mantener manualmente un mapa de sesiones con la clave identificada (la identificación de sesión se puede recuperar a través de session.getId() ). Luego podrá recuperar cualquier sesión que desee (en lugar de engañar al contenedor para que reemplace su sesión actual, como sugirieron otros).


No hay forma de especificar el servlet, pero podrías intentarlo:

  • configurar manualmente la cookie en la solicitud hecha por Flash

  • o haciendo lo que Taylor L acaba de sugerir mientras estaba escribiendo y agregando el parámetro jsessionid a la ruta del URI.

Ambos métodos vincularán tu aplicación a la ejecución en un contenedor de servlets que se comporta como Tomcat; Creo que la mayoría de ellos lo hacen. Ambos también requerirán que su applet de Flash solicite a la página sus cookies, lo que puede imponer una dependencia de JavaScript.


Si usa Tomcat, pregunte directamente a tomcat (pero es feo). Apuesto a que hay otras soluciones hacky para otros servidores web.

Utiliza una instancia de la interfaz "Administrador" para administrar las sesiones. Lo que lo hace feo es que no he encontrado una buena interfaz pública para poder conectarme, así que tenemos que usar la reflexión para obtener el administrador.

Debajo hay un oyente de contexto que toma ese administrador en el inicio del contexto, y luego puede usarse para obtener la sesión de Tomcat.

public class SessionManagerShim implements ServletContextListener { static Manager manager; @Override public void contextInitialized(ServletContextEvent sce) { try { manager = getManagerFromServletContextEvent(sce); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } @Override public void contextDestroyed(ServletContextEvent sce) { manager = null; } private static Manager getManagerFromServletContextEvent(ServletContextEvent sce) throws NoSuchFieldException, IllegalAccessException { // Step one - get the ApplicationContextFacade (Tomcat loves facades) ApplicationContextFacade contextFacade = (ApplicationContextFacade)sce.getSource(); // Step two - get the ApplicationContext the facade wraps Field appContextField = ApplicationContextFacade.class.getDeclaredField("context"); appContextField.setAccessible(true); ApplicationContext applicationContext = (ApplicationContext) appContextField.get(contextFacade); // Step three - get the Context (a tomcat context class) from the facade Field contextField = ApplicationContext.class.getDeclaredField("context"); contextField.setAccessible(true); Context context = (Context) contextField.get(applicationContext); // Step four - get the Manager. This is the class Tomcat uses to manage sessions return context.getManager(); } public static Session getSession(String sessionID) throws IOException { return manager.findSession(sessionID); } }

Puede agregar esto como un oyente en su web.xml y debería funcionar.

Entonces podrías hacer esto para obtener una sesión.


Una forma segura de hacerlo es establecer el ID de jsession en la cookie, esto es mucho más seguro que configurarlo en la url.

Una vez que se establece como una cookie, puede recuperar la sesión de la manera normal utilizando

request.getSession(); method.setRequestHeader("Cookie", "JSESSIONID=88640D6279B80F3E34B9A529D9494E09");