2010-10-10 2 views
3

J'ai un service Web JAX-RS pour lequel je souhaite désactiver la politique d'origine identique via les nouveaux en-têtes HTTP CORS. (Je suis pleinement conscient des implications de sécurité.)Annotations personnalisées pour définir les en-têtes de réponse HTTP dans un service JAX-RS

J'aimerais avoir une annotation personnalisée qui me permet de définir les en-têtes de réponse HTTP. Par exemple,

@ResponseHeaders({"Access-Control-Allow-Origin: *", 
        "Access-Control-Allow-Methods: GET"}) 
// Or, alternatively: 
@AllowOrigins({"*"}) 
public String resourceMethod() { ... } 

Cette approche minimise le code standard, mais je ne suis pas sûr qu'il existe une limitation technique subtile; JAX-RS fournit de nombreuses annotations pour gérer la requête HTTP mais pas la réponse, @Produces semblant être la seule exception.

Je préfère également rester loin de trop de configuration web.xml, si possible. Sans avoir explicitement besoin d'utiliser un ResponseBuilder (c'est correct si une annotation en utilise une), existe-t-il un moyen propre de définir des en-têtes de réponse HTTP personnalisés?

Pour clarifier, je cherche annotations qui s'intègrent aux différentes façons de définir les en-têtes de réponse HTTP afin de minimiser le code standard.

+1

duplication possible de [Ajouter l'en-tête de réponse à WebService JAX-RS] (http://stackoverflow.com/questions/1493415/add-response-header-to-jax-rs-webservice) –

+0

Je cherche quelque chose un peu plus rationalisé; Les annotations qui utilisent HttpServletResponse peuvent fonctionner. Je ne suis pas sûr des subtilités entre javax.ws.rs.Response et HttpServletResponse, cependant. – ide

Répondre

0

La seule approche basée sur les spécifications est peut-être d'utiliser un MessageBodyWriter personnalisé. Dans la méthode writeTo(), vous êtes passé dans un MultivaluedMap sur lequel vous pouvez définir des en-têtes de réponse. Vous êtes également passé les annotations sur la méthode de ressource invoquée (de sorte que vous pouvez obtenir toutes les annotations personnalisées souhaitées). Lisez donc les annotations, définissez les en-têtes via MultivaluedMap, puis utilisez le OutputStream transmis pour écrire le corps du message. Dans Apache Wink et éventuellement d'autres frameworks JAX-RS, vous pouvez créer des gestionnaires côté serveur personnalisés qui peuvent également lire les annotations sur la méthode ressource et faire ce que vous voulez (comme définir les en-têtes de réponse par défaut).

Questions connexes