Jersey: Défaut de Contrôle de Cache pour no-cache
Pendant l'écriture d'un service web RESTful, je rencontre des problèmes si je permettre à toute sorte de mise en cache sur mon client (qui est actuellement une .NET client lourd). Par défaut, Maillot n'est pas de l'envoi de toute sorte de cache tête de contrôle, de sorte que le client est mise en cache de la plupart des pages automatiquement (ce qui semble être valide comportement).
Je voudrais avoir Jersey par défaut envoyer un cache de contrôle de la "no-cache", puis, en particulier, les réponses de remplacer le cache de contrôle.
Est-il possible de faire cela avec Jersey?
J'ai trouvé que RESTeasy a la possibilité d'utiliser le @NoCache annotation pour spécifier les paramètres de l'ensemble de la classe, mais je n'ai pas trouvé quelque chose de similaire avec Jersey.
Vous devez vous connecter pour publier un commentaire.
C'est facile avec un Maillot en utilisant une ResourceFilterFactory - vous pouvez créer des annotations personnalisées que vous attachez à vos méthodes de jeu de cache paramètres de contrôle. ResourceFilterFactories appelée pour chaque ressource découverte de la méthode lors de l'application initialise dans votre ResourceFilterFactory vous pouvez vérifier si la méthode a votre @CacheControlHeader annotation (ou ce que vous voulez l'appeler) - si non, il suffit de retourner la réponse filtre qui ajoute "no-cache" directive pour la réponse, sinon il doit utiliser les paramètres de l'annotation. Voici un exemple de la façon de le faire:
L'annotation peut ressembler à ceci:
La ResourceFilterFactory peut être enregistré dans votre application par adjonction, init-param à la définition de Jersey servlet dans web.xml:
Basé sur la solution de @martin-matula, j'ai créé deux Cache annotations. Un
@NoCache
pour aucune mise en cache à tous et un@CacheMaxAge
spécifiques de mise en cache. LeCacheMaxAge
prend deux arguments de sorte que vous n'avez pas à calculer le nombre de secondes vous-même:La ResourceFilter a maintenant cette méthode de création qui par défaut n'interfère pas (afin que les autres mécanismes de mise en cache de continuer à travailler):
Vous pouvez voir la solution complète dans mon article sur le blog.
Merci pour la solution Martin!
@martin-matula la solution ne fonctionne pas avec JAX-RS 2.0 /Maillot 2.x comme ResourceFilterFactory et ResourceFilter ont été supprimés. La solution peut être adaptée à JAX-RS 2.0 comme suit.
Annotation:
DynamicFeature:
CacheFilterFactory doit être inscrit auprès de Jersey. Je suis en train de faire via Dropwizard - à l'aide de l'environnement.jersey().register() - mais sur des systèmes autonomes, je comprends ce qui peut être fait par exemple en laissant Maillot de numériser vos classes pour @Fournisseur annotations en définissant les éléments suivants dans votre web.xml:
Voir ce post pour plus d'informations sur l'enregistrement des composants.
Je pense que vous pouvez utiliser le
qui va arrêter la mise en cache dans le navigateur.
Voir:
http://jersey.java.net/nonav/apidocs/1.12/jersey/javax/ws/rs/core/CacheControl.html#isNoCache%28%29
Espère que cette aide.
J'ai trouvé une annotation qui peut désactiver la mise en cache. Vous pouvez utiliser l'annotation suivante pour votre API:
Ref: Maillot Annotation de contrôle de cache