2011-04-27 19 views
6

Necesito acceder al administrador desde el servlet (o filtro) en Tomcat para cargar la sesión personalizada mediante el ID de sesión personalizado.Tomcat: cómo acceder al administrador (sesión) desde el servlet

Respondiendo a su próxima pregunta: ¿por qué la necesito? Hay un viejo error en Flash que hace que envíe cookies desde IE y no desde el navegador actual. Entonces, si estoy en FF y estoy tratando de cargar el archivo con SWFUpload, termino con la sesión incorrecta y un error.

Quiero agregar el parámetro mágico a POST que debe anular el ID de sesión predeterminado (incorrecto), luego cargar la sesión personalizada en lugar de uno cargado por Tomcat. No puedo usar la reescritura de URL ya que las cookies se resuelven primero, y cuando el flash envía una cookie incorrecta desde IE, Tomcat no intenta cargar la sesión desde la dirección reescrita url.

Agradecería cualquier otra pista sobre cómo acceder al Administrador de contexto o una solución del problema original.

Gracias de antemano, Juriy

Respuesta

4

debe ser accesible a través de la implementación de ServletContext. Obtenga las fuentes de tomcat para verificar eso, o use el reflejo para obtener todos los campos del contexto. Puede que tenga que usar muchos reflejos para llegar al administrador.

(no pude encontrar si el gestor está expuesto en JNDI, pero se puede buscar allí también)

5

para Tomcat:

ApplicationContextFacade appContextFacadeObj = (ApplicationContextFacade) request.getSession().getServletContext(); 

    try 
    { 
     Field applicationContextField = appContextFacadeObj.getClass().getDeclaredField("context"); 
     applicationContextField.setAccessible(true); 
     ApplicationContext appContextObj = (ApplicationContext) applicationContextField.get(appContextFacadeObj); 
     Field standardContextField = appContextObj.getClass().getDeclaredField("context"); 
     standardContextField.setAccessible(true); 
     StandardContext standardContextObj = (StandardContext) standardContextField.get(appContextObj); 
     Manager persistenceManager = standardContextObj.getManager(); 
    } 
    catch(SecurityException e) 
    { 
     logger.error(e); 
    } 
    catch(NoSuchFieldException e) 
    { 
     logger.error(e); 
    } 
    catch(IllegalArgumentException e) 
    { 
     logger.error(e); 
    } 
    catch(IllegalAccessException e) 
    { 
     logger.error(e); 
    } 
6

A diferencia de código Ihor 's, este código utiliza un poco menos de la abstracción por conseguir Manager de HttpSession:

private Manager manager(HttpSession session) throws Exception { 

    Field facadeSessionField = StandardSessionFacade.class.getDeclaredField("session"); 
    facadeSessionField.setAccessible(true); 
    StandardSession stdSession = (StandardSession) facadeSessionField.get(session); 

    return stdSession.getManager(); 
} 
+0

esto realmente salvado el pellejo, gracias! – RTF

Cuestiones relacionadas