Interception de JAX-RS Demande: Enregistrer un ContainerRequestFilter avec tomcat
Je suis d'essayer d'intercepter une requête à mon JAX-RS webservice par un ContainerRequestFilter. Je veux l'utiliser avec une mesure d'annotation, de sorte que je peux décorer certaines méthodes du service web. Cela devrait me permettre de traiter les demandes de ces méthodes sur la base des informations qu'ils sont émis sur un canal sécurisé
ou pas, avant l'exécution de la méthode.
J'ai essayé différentes approches, fouillée à plusieurs postes, puis mis en œuvre principalement basé sur la réponse par Alden dans ce post.
Mais je ne peux pas le faire fonctionner.
J'ai une méthode de test de mon webservice décorées avec mes annotations personnalisées Ssl.
@POST
@Path("/test")
@Ssl
public static Response test(){
System.out.println("TEST ...");
}
L'annotation ressemble à ceci:
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Ssl {}
Puis-je configurer un filtre de mise en œuvre
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
@Ssl
@Provider
public class SslInterceptor implements ContainerRequestFilter
{
@Override
public void filter(ContainerRequestContext requestContext) throws IOException
{
System.out.println("Filter executed.");
}
}
Mais le filtre n'est jamais exécutée, ni il se produit des messages d'erreur ou d'avertissement. La méthode de test fonctionne très bien, de toute façon.
Pour le résoudre, j'ai essayé d'enregistrer le filtre dans la web.xml comme décrit ici.
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
<param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.my.packagewithfilter</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.my.packagewithfilter.SslInterceptor</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.my.packagewithfilter</param-value>
</init-param>
</servlet>
Mais qui ne fonctionne pas. Ce qui me manque? Des idées comment faire pour que le filtre fonctionne? Toute aide est vraiment apprécié!
OriginalL'auteur tareq | 2014-02-04
Vous devez vous connecter pour publier un commentaire.
Vous êtes à l'aide de JAX-RS 2.0 Api (demande de filtres, le nom de liaison, ...) dans vos classes, mais Maillot 1 propriétaire init params dans votre
web.xml
(forfait à partir aveccom.sun.jersey
, Maillot 2 utiliseorg.glassfish.jersey
). Jetez un oeil à ce réponse et à ces articles:Maintenant, j'ai créé un nouveau nettoyage de JAX-RS projet basé uniquement sur le Maillot 2. Maintenant, je peux utiliser javax.ws.rs.le conteneur.ContainerRequestFilter et le lier à certaines méthodes de mes services. fonctionne parfaitement maintenant. Merci!!
OriginalL'auteur Michal Gajdos
Juste de la compilation de la réponse de Michael Gajdos pour aider quelqu'un qui ne veulent pas ouvrir plusieurs onglets:
Lorsque vous utilisez Jersey-2, vous devez utiliser le suivre de configuration pour enregistrer votre filtre dans le web.xml
jersey.config.serveur.fournisseur de.les noms de classe
au lieu de
com.soleil.jersey.le spi.le conteneur.ContainerRequestFilters (jersey-1x)
OriginalL'auteur Vitorlui
Ont un coup d'oeil à ce blog pour les plus "classiques" approches (sans l'aide de l'annotation)
OriginalL'auteur ACV