¿Cómo se intercepta una solicitud durante el ciclo de vida de la Camiseta?


He usado Jersey durante la mayor parte de un año y me he topado con un problema al que no puedo encontrar la respuesta: ¿cómo interceptar (o enganchar) el ciclo de vida de la solicitud de Jersey?

Idealmente, podría realizar algún filtrado/validación/rechazo personalizado entre el momento en que el contenedor acepta la solicitud de la red y el momento en que se llaman mis métodos de controlador. Puntos de bonificación si hay una manera fácil de filtrar los interceptores por sub-ruta (por ejemplo, tener un interceptor para cualquier cosa bajo /, otro para cualquier cosa bajo / user/, etc.).

Gracias!

Edit: Para ser un poco más claro, la idea general aquí es poder escribir algún código que se ejecutará para muchas llamadas API sin tener que llamar explícitamente a ese código desde cada método manejador. Esto reduciría el código adicional y eliminaría la necesidad de pasar contextos de solicitud.

Author: cww, 2010-12-05

4 answers

He encontrado la respuesta.

Primero, cree una clase que implemente ContainerRequestFilter. La interfaz especifica el siguiente método, en el que se lleva a cabo el filtrado. El objeto ContainerRequest contiene información sobre la solicitud actual.

public ContainerRequest filter(ContainerRequest req);

Después de eso, incluya el siguiente XML en la configuración del servlet en web.xml

<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
  <param-value>path.to.filtering.class</param-value>
</init-param>

Fuentes:

Http://jersey.576304.n2.nabble.com/ContainerRequestFilter-and-Resources-td4419975.html http://markmail.org/message/p7yxygz4wpakqno5

 50
Author: cww,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-16 21:35:30

Este hilo es un poco viejo, pero estaba teniendo un ataque de tiempo interceptando antes y después de la solicitud. Después de una larga búsqueda en la web, finalmente me di cuenta de esto:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>blah.LoggingFilter</param-value>
</init-param>
<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>blah.LoggingFilter</param-value>
</init-param>

Y luego esta clase:

public class LoggingFilter extends LoggingFilter implements ContainerRequestFilter {

    private static final ThreadLocal<Long> startTime = new ThreadLocal<Long>();
    public static boolean verboseLogging = false;

    @Override
    public ContainerRequest filter(ContainerRequest arg0) {
        startTime.set(System.currentTimeMillis());
        return arg0;
    }

    @Override
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
        System.out.println(System.currentTimeMillis() - startTime.get().longValue());
        StringBuilder sb = new StringBuilder();
        sb.append("User:").append((request.getUserPrincipal() == null ? "unknown" : request.getUserPrincipal().getName()));
        sb.append(" - Path:").append(request.getRequestUri().getPath());
        //...
    }

Esto intercepta la solicitud al principio y al final para que pueda poner un temporizador o lo que sea.

Esto funciona para Jersey 1.17. No estoy seguro sobre 2.x.

 8
Author: markthegrea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-27 10:13:37

Para la parte del servidor usamos una clase específica de Jersey para hacer algo como esto: ContainerResponseFilter

La firma es:

public ContainerResponse filter(ContainerRequest request, ContainerResponse response)

Entonces puedes hacer llamadas como:

Object entity  = response.getEntity();
    ... your logic here ...
return response;

¿Puede esto ser de alguna ayuda ?..

 0
Author: a1o1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-11 07:46:48

¿Has mirado la clase Jersey ClientFilter?

Actualmente estamos usando esto para interceptar y realizar versioing de API, etc.. Hay filtros de registro incorporados, por lo que puede mirar el código para que tengan una idea de qué escribir.

La firma es:

public ClientResponse handle(final ClientRequest cr) throws ClientHandlerException...

Así que puedes empezar haciendo cosas como:

....
cr.getHeaders()
....
return getNext().handle(cr);
 -1
Author: a1o1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-11 07:48:33