AEM Compruebe y analice si la sesión JCR se filtra en la instancia de

Última actualización: 2023-10-31

AEM Compruebe e identifique la causa de la fuga de sesión JCR de la aplicación de 6.x.

Descripción

AEM Compruebe si la aplicación de 6.x tiene una fuga de sesión JCR y rastree el origen.

Entorno

AEM 6.4,6.5

Resolución

I. COMPRUEBE SI HAY UNA FUGA DE SESIÓN

  1. Ir a http://host:port/system/console/jmx e inicie sesión como administrador.
  2. Utilice la función de búsqueda del explorador para buscar todas las ocurrencias de objetos SessionStatistics en la página.
  3. Si encuentra más de 500, entonces hay una fuga de sesión.

II. IDENTIFICAR EL CÓDIGO QUE FILTRA LAS SESIONES

Si ha encontrado una fuga de sesión, siga los pasos a continuación para encontrar la causa.

  1. Desplácese hacia abajo por la página hasta los objetos SessionStatistics.
  2. Abra algunos de los objetos SessionStatistics en una nueva pestaña del explorador usando [Ctrl] +Haciendo clic en algunos que incluyan una marca de tiempo posterior o un número de id superior.  Por ejemplo, el de abajo tiene un id de
  3. 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2020 7:03:25 PM" {id=287}.
  4. AEM Cuanto mayor sea el número de ID, más tarde se creará la sesión tras el último reinicio de la.
  5. Revise los seguimientos de pila que muestran qué código abrió esas sesiones.
  6. Busque paquetes java de aplicaciones en la pila.  Si el código forma parte de la aplicación, consulte la siguiente sección.

III. CORREGIR LA FUGA DE SESIÓN

Para evitar y corregir las fugas de sesión JCR:

  • Si abre un javax.jcr.Session en el código, ciérrelo siempre mediante Session.logout()
  • Si abre un org.apache.sling.api.resource.ResourceResolver en el código, ciérrelo siempre mediante ResourceResolver.close()

Cerrar objetos de sesión:

El siguiente código deja abierta una sesión:

try {
Session session = repository.loginAdministrative(null);
Node node = session.getNode("/content/we-retail");
  log.info("Node: " + node.getPath());
} catch (RepositoryException re) {
log.error(re.getMessage(), re);
}

*Nota:*Además de cerrar la sesión, este código también llama a repository.loginAdministrative para abrirla. AEM Esta forma de abrir sesiones ha quedado obsoleta en versiones posteriores de la aplicación por motivos de seguridad

Para cerrar la sesión, envolvería el código con un bloque try/finally y llamaría a session.logout():

Session session = null;
try {
session = repository.loginAdministrative(null);
// use session
} catch (RepositoryException re) {
log.error(re.getMessage(), re);
} finally {
if (session != null && session.isLive()) {
session.logout();
}
}

Tenga cuidado al crear una sesión o compartirla.  Cuando comparte una sesión entre objetos, resulta más difícil rastrear dónde se abrió y cuándo se debe cerrar.  Además, las sesiones nunca deben compartirse en Java Threads.

Cierre de objetos ResourceResolver:

El siguiente código deja un ResourceResolver abierto:

try{
ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap);
  Resource resource = resourceResolver.getResource("/content/we-retail");
  log.info("Resource: " + res.getPath());
} catch(Exception e){
log.error(e.getMessage());
}

Para cerrar resourceResolver, ajuste el código con un bloque try/finally y llame a resourceResolver.close():

try{
ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap);
  // use ResourceResolver
} catch (Exception e) {
log.error(e.getMessage());
} finally {
if(resourceResolver != null && resourceResolver.isLive()) {
resourceResolver.close();
  }
}

Nota importante

La aplicación no debe cerrar los objetos ResourceResolver que se obtienen mediante SlingRequest o WorkflowSession.  Por ejemplo:

slingRequest.getResourceResolver().adaptTo(Session.class);
//Or
workflowSession.getSession();

La resolución y la sesión se cerrarán automáticamente una vez procesada la solicitud.

En esta página