12 votes

Comment récupérer les ressources correspondantes d'une requête dans un ContainerRequestFilter ?

Je travaille sur un WebService utilisant JAX-RS/Jersey.

J'ai mis en place un ContainerRequestFilter dont le but est d'authentifier l'utilisateur. Je n'ai besoin de protéger qu'une partie des chemins avec une authentification, le reste peut être accessible à tous.

Je veux récupérer les matchedResources / matchedResults via ExtendedUriInfo dans mon ContainerRequestFilter afin de pouvoir vérifier si le chemin doit être protégé ou non. Existe-t-il un moyen de créer un filtre qui est invoqué après le remplissage de l'ExtendedUriInfo, mais avant l'appel de la classe et de la méthode de la ressource correspondante ?

10voto

Kevin L. Points 306

Voici une réponse plus générale (par exemple si vous utilisez une autre implémentation de jax-rs comme CXF) :

Il suffit d'ajouter ce qui suit dans votre classe de filtre en tant que variable d'instance :

@Contexte

ResourceInfo info ;

"javax.ws.rs.container.ResourceInfo est un nouveau contexte JAX-RS qui peut être injecté dans des filtres et des intercepteurs et vérifié quelle ressource et la méthode sont sur le point d'être invoquées. "

(source : https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Basics#JAX-RSBasics-ResourceInfo )

Réponse originale ici

5voto

Arthur Points 1454

J'ai trouvé un moyen de le faire avec ContainerRequestFilter :

public void filter(ContainerRequestContext requestContext) {
    UriRoutingContext routingContext = (UriRoutingContext) requestContext.getUriInfo();
    ResourceMethodInvoker invoker = (ResourceMethodInvoker) routingContext.getInflector();
    Class<?> className = invoker.getResourceClass();
    Method methodName = invoker.getResourceMethod();
}

3voto

John B Points 195

J'ai réussi à comprendre.

L'approche que j'ai trouvée efficace est d'abandonner l'idée de faire cela dans la ContainerRequestFilter et créer un ResourceFilterFactory à la place. Dans le ResourceFilterFactory Je peux utiliser

AbstractMethod.isAnnotationPresent(clazz)

pour déterminer si mon annotation personnalisée est présente. Si mon annotation est présente, je peux alors renvoyer une liste contenant mon AuthenticationContainerRequestFilter .

Un autre conseil pour tous ceux qui liront cette réponse est que l'injection dans le ContainerRequestFilter ne fonctionnera pas si l'on utilise la méthode de l'utilisateur. ResourceFilterFactory approche. Ce que j'ai fait, c'est de faire n'importe quelle injection dans les ResourceFilterFactory et ensuite passer les objets injectés à la ContainerRequestFilter via son constructeur.

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