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.
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.
vous n'avez pas déclaré la méthode, qui est par défaut d'accepter seulement la méthode get.
essayez registry.allowedMethods("*");
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:
allowedOrigins ne peut pas être * si allowCredentials est vrai. Ceci est documenté à Mozilla.org
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é.
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
).
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.