2009-12-28 19 views
7

Quiero vincular un JPA EntityManager al hilo actual en cada solicitud (a través de ThreadLocal), lo que podría hacerse a través de ServletRequestListener o Filter. El oyente se ve más limpio y no necesito las posibilidades adicionales de un filtro en este caso. Pero tal vez el filtro tiene una ventaja que me he perdido.Servlet Filter vs. ServletRequestListener

¿Debo usar un Servlet Filter o un ServletRequestListener para hacer eso?

+1

¿Hay alguna garantía sobre el ServletRequestListener? ¿Está seguro de que se invoca sincrónicamente, en el mismo hilo que el manejo de la solicitud? –

+0

La especificación de Servlet 3.0 dice: "11.5 Instancias de escucha y subprocesamiento [...] El contenedor debe mantener una referencia a cada instancia de escucha hasta que se atiende la última solicitud para la aplicación web. Los cambios de atributos en los objetos ServletContext y HttpSession pueden ocurrir al mismo tiempo. No es necesario que el contenedor sincronice las notificaciones resultantes para atribuir clases de escucha. Las clases de escucha que mantienen el estado son responsables de la integridad de los datos y deben manejar este caso de manera explícita ". Pero esa no es la respuesta a su pregunta ... I * think * sería en el mismo hilo. – deamon

Respuesta

7

Para su propósito no hay mucha diferencia. Pero un oyente es "más limpio" en el sentido de que alguien que lea su código sabrá inmediatamente que el propósito de este código no puede ser interceptar la solicitud o alterarla o hacer otras cosas que un filtro puede hacer.

Spring, por ejemplo, utiliza un ServletRequestListener para permitir que las aplicaciones Spring basadas en la web que no están utilizando el propio marco Web MVC de Spring tengan acceso a funcionalidades específicas de la web, como beans de sesión. Ver this doc.

Editar: sólo para estar más clara, menciono RequestContextListener de primavera, ya que hace exactamente lo que estamos hablando: crear un objeto ThreadLocal para almacenar datos que se puede acceder a través del resto de la solicitud del ciclo de vida.

+0

¿Pueden aclarar esto por mí? 'ServletRequestListener' escucha' ServletRequestEvent', que es un evento activado para cada solicitud entrante. Si deseo registrar el agente de usuario para cada solicitud a mi aplicación web, ¿debería usar este oyente o un filtro? – arun

+0

Cualquiera de los dos probablemente esté bien. – Dan