La configuration globale du CORS de Spring ne fonctionne pas mais la configuration au niveau du contrôleur fonctionne

j'essaie de configurer CORS globalement via WebMvcConfigurerAdapter illustré ci-dessous. Pour tester, j'utilise mon terminal API via une application à petit noeud que j'ai créée pour émuler un service externe. Lorsque j'essaie cette approche, la réponse ne contient pas les en-têtes corrects et échoue avec

XMLHttpRequest cannot load http://localhost:8080/api/query/1121. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:333' is therefore not allowed access.

Global Config

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/query/**")
                    .allowedOrigins("*")
                    .allowedHeaders("*")
                    .allowCredentials(true);
        }
}

cependant quand j'utilise le @CrossOrigin annotation comme il fonctionne très bien répondre avec la bonne tête.

@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*")
@RestController
@RequestMapping(value = "/api/query", produces = MediaType.APPLICATION_JSON_VALUE)
public class QueryController {
   ......
}

Produit

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:333

Qu'est-ce que je manque pour faire fonctionner la configuration globale (j'ai suivi les instructions ici https://spring.io/blog/2015/06/08/cors-support-in-spring-framework). J'ai l'impression de rater quelque chose de simple puisque l'annotation du contrôleur fonctionne très bien.

20
demandé sur Adam James 2016-06-23 04:38:02

5 réponses

pour que la configuration globale de CORS fonctionne, le client doit ajouter ces deux en-têtes dans la requête OPTIONS.

Origin: http://host.com
Access-Control-Request-Method: POST

cependant l'annotation @CrossOrigin ne nécessite que l'en-tête" Origin".

Votre client ajoute probablement l'en-tête " Origin "mais manque la"Access-Control-Request-Method".....c'est pourquoi cela fonctionne pour vous avec le @CrossOrigin, mais pas avec le Global config.

11
répondu outdev 2016-07-03 11:30:27

vous n'avez pas déclaré la méthode, qui est par défaut d'accepter seulement la méthode get. essayez registry.allowedMethods("*");

4
répondu dhyanandra singh 2016-07-02 13:38:27

j'ai réussi à faire fonctionner la configuration du spring Global CORS, après avoir expérimenté le problème décrit dans ce numéro. J'ai eu à faire 2 choses:

  1. allowedOrigins ne peut pas être * si allowCredentials est vrai. Ceci est documenté à Mozilla.org

  2. Supprimer mvc:annotation-driven de la source XML. Ne peut pas avoir à la fois la config XML et @EnableWebMvc. La classe globale ne fonctionnera pas sans @EnableWebMvc, donc mvc: doit être piloté par annotation être supprimé.

2
répondu animuson 2017-12-21 05:27:28

je pense que votre définition de la cartographie manque un *:

registry.addMapping("/api/query/**")

Sans que les extra *, cette configuration n'est pas mappée à /api/query/1121 chemin de requête (mais cela fonctionnerait sur /api/query/5).

0
répondu Brian Clozel 2016-06-23 08:31:10

j'ai fait face à des questions semblables. J'ai changé le WebMvcConfigurerAdapter en WebMvcConfigurationSupport et il a commencé à fonctionner.

en plus de cela, j'ai aussi déplacé le RequestMappingHandlerMapping défini dans le fichier de configuration xml vers la configuration java.

0
répondu Bharat Singh 2017-01-31 12:06:32