¿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.
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
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.
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 ?..
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);
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