append automatiquement un en-tête à chaque réponse

Je veux append cet en-tête “Access-Control-Allow-Origin”, “*” à chaque réponse faite au client chaque fois qu’une requête a été faite pour que les contrôleurs de repos de mon application autorisent le partage de ressources entre origines. en-tête à chaque méthode comme celle-ci

HttpHeaders headers = new HttpHeaders(); headers.add("Access-Control-Allow-Origin", "*"); 

Son fonctionnement mais c’est très frustrant. J’ai trouvé webContentInterceptor dans les documents de spring, ce qui nous permet de modifier les en-têtes de chaque réponse

      

mais quand je l’utilise, il se produit une erreur indiquant que la propriété introuvable du nom Access-Control-Allow-Origin existe de toute autre manière, nous pouvons append automatiquement un en-tête à chaque réponse

Mettre à jour ! Spring Framework 4.2 simplifie grandement cette opération en ajoutant une annotation @CrossOrigin à une méthode ou à un contrôleur lui-même. Https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

J’ai récemment abordé cette question et trouvé cette solution. Vous pouvez utiliser un filtre pour append ces en-têtes:

 import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.filter.OncePerRequestFilter; public class CorsFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { response.addHeader("Access-Control-Allow-Origin", "*"); if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) { // CORS "pre-flight" request response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); response.addHeader("Access-Control-Allow-Headers", "X-Requested-With,Origin,Content-Type, Accept"); } filterChain.doFilter(request, response); } } 

N’oubliez pas d’append le filtre à votre contexte de spring:

  

et le mappage dans le web.xml:

  corsFilter org.springframework.web.filter.DelegatingFilterProxy   corsFilter /*  

Pour aller un peu plus loin, vous pouvez spécifier un profil Spring pour activer ou désactiver ce filtre avec quelque chose comme ça:

       

(fournissant le filtre FilterChainDoFilter similaire au filtre CorsFilter mais qui ne fait que filterChain.doFilter(request, response); dans le filtre doFilterInternal (..))

Mettre à jour ! Spring Framework 4.2 simplifie grandement cette opération en ajoutant une annotation @CrossOrigin à une méthode ou à un contrôleur lui-même. https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

Si vous souhaitez définir des en-têtes pour le contrôleur, vous pouvez utiliser l’annotation @ModelAtsortingbute .

 @ModelAtsortingbute public void setVaryResponseHeader(HttpServletResponse response) { response.setHeader("Vary", "Accept"); } 

Au spring 4, vous pouvez utiliser le @CrossOrigin () qui vous permet le problème de l’origine croisée.

Pour des raisons de sécurité, les navigateurs interdisent les appels AJAX aux ressources résidant en dehors de l’origine actuelle. Par exemple, lorsque vous vérifiez votre compte bancaire dans un onglet, vous pouvez avoir le site Web evil.com dans un autre onglet. Les scripts de evil.com ne devraient pas pouvoir envoyer de requêtes AJAX à votre API bancaire (en retirant de l’argent de votre compte!) En utilisant vos identifiants.

Le partage de ressources croisées (CORS) est une spécification W3C implémentée par la plupart des navigateurs qui vous permet de spécifier de manière flexible le type de requêtes interdomaines autorisées, au lieu d’utiliser des hacks moins sécurisés et moins puissants comme IFrame ou JSONP.

Spring Framework 4.2 GA fournit un support de première classe pour CORS, vous offrant ainsi un moyen plus simple et plus puissant de le configurer que les solutions classiques basées sur des filtres.

Vous pouvez append une annotation @CrossOrigin à votre méthode de gestionnaire annoté @RequestMapping afin d’activer CORS sur celle-ci. Par défaut, @CrossOrigin autorise toutes les origines et les méthodes HTTP spécifiées dans l’annotation @RequestMapping:

 @RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @RequestMapping("/{id}") public Account resortingeve(@PathVariable Long id) { // ... } @RequestMapping(method = RequestMethod.DELETE, path = "/{id}") public void remove(@PathVariable Long id) { // ... } } 

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html

https://spring.io/guides/gs/rest-service-cors/

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

WebContentInterceptor n’a pas de propriété nommée Access-Control-Allow-Origin et, pour autant que je WebContentInterceptor , il n’expose aucune méthode pour définir les en-têtes de réponse. Il ne définit que certains en-têtes liés au cache en activant / désactivant certaines propriétés. Mais il est sortingvial d’écrire votre propre intercepteur (ou filtre de servlet).

Je suis également confronté à ce problème et j’ai ajouté ce problème de code corrigé.

 public static HttpServletResponse getResponse(HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", "*"); response.setCharacterEncoding("UTF-8"); response.setHeader("Access-Control-Allow-Methods", "POST, GET"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); return response; }