49 votes

Comment intercepter une demande pendant le cycle de vie de Jersey ?

J'utilise Jersey depuis près d'un an maintenant et je viens de tomber sur un problème auquel je n'arrive pas à trouver de réponse : comment intercepter (ou s'accrocher) au cycle de vie des requêtes Jersey ?

Idéalement, je devrais pouvoir effectuer un filtrage/validation/rejet personnalisé entre le moment où le conteneur accepte la requête du réseau et le moment où mes méthodes de gestion sont appelées. Des points bonus s'il y a un moyen facile de filtrer les intercepteurs par sous-chemin (par exemple, avoir un intercepteur pour tout ce qui se trouve sous /, un autre pour tout ce qui se trouve sous /user/, etc.)

Merci !

Edit : Pour être un peu plus clair, l'idée générale ici est de pouvoir écrire un code qui sera exécuté pour de nombreux appels d'API sans avoir à appeler explicitement ce code à partir de chaque méthode de gestionnaire. Cela réduirait le code supplémentaire et éliminerait le besoin de faire circuler les contextes de requête.

51voto

cww Points 676

J'ai trouvé la réponse.

Tout d'abord, créez une classe qui implémente ContainerRequestFilter. L'interface spécifie la méthode suivante, dans laquelle le filtrage a lieu. L'objet ContainerRequest contient des informations sur la requête en cours.

public ContainerRequest filter(ContainerRequest req);

Après cela, incluez le XML suivant dans la configuration de la servlet dans web.xml

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

Sources :

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

9voto

markthegrea Points 666

Ce fil est un peu vieux, mais j'ai eu beaucoup de mal à intercepter les deux avant et après la demande. Après une longue recherche sur le web, j'ai finalement trouvé la solution :

<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>

et ensuite cette classe :

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());
        //...
    }

Cela permet d'intercepter la demande au début et à la fin, de sorte que vous pouvez mettre en place une minuterie ou autre.

Cela fonctionne pour Jersey 1.17. Je ne suis pas sûr pour la version 2.x.

0voto

a1o1 Points 58

Pour la partie serveur, nous utilisons une classe Jersey Specific pour faire quelque chose comme ceci : ContainerResponseFilter

La signature est :

public ContainerResponse filter(ContainerRequest request, ContainerResponse response)

alors vous pouvez faire des appels comme :

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

Est-ce que cela peut être utile ?

-1voto

a1o1 Points 58

Avez-vous regardé le site de Jersey [ClientFilter](http://jersey.java.net/nonav/apidocs/1.4/jersey/com/sun/jersey/api/client/filter/ClientFilter.html) classe ?

Nous l'utilisons actuellement pour intercepter et effectuer des versements d'API, etc. Les filtres de journalisation sont intégrés, vous pouvez donc consulter leur code pour avoir une idée de ce qu'il faut écrire.

La signature est :

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

Donc tu peux commencer par faire des trucs comme :

....
cr.getHeaders()
....
return getNext().handle(cr);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X