web-dev-qa-db-fra.com

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

J'essaie de configurer CORS globalement via WebMvcConfigurerAdapter ci-dessous. Pour tester, je suis en train de frapper mon noeud final API via une application de 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.

Configuration globale

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, lorsque j'utilise l'annotation @CrossOrigin comme si cela fonctionnait très bien, je répondais avec les en-têtes appropriés.

@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

Que manque-t-il pour que la configuration globale fonctionne (suivez les instructions ici https://spring.io/blog/2015/06/08/cors-support-in-spring-framework ). J'ai l'impression qu'il me manque quelque chose de simple, car annoter le contrôleur fonctionne très bien.

24
Adam James

Pour que la configuration globale CORS fonctionne, le client doit ajouter ces deux en-têtes dans la demande OPTIONS.

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

Toutefois, l'annotation @CrossOrigin nécessite uniquement l'en-tête "Origine".
Votre client ajoute probablement l’en-tête "Origin" mais il manque la "Méthode de demande de contrôle d’accès" ..... c’est pourquoi il fonctionne pour vous avec @CrossOrigin, mais pas avec la configuration globale. 

13
outdev

vous n'avez pas déclaré de méthode dans ce qui est par défaut accepter uniquement la méthode get . try registry.allowedMethods("*"); 

4
dhyanandra singh

J'ai réussi à faire fonctionner la configuration Spring Global CORS après avoir rencontré le problème exact décrit dans ce numéro. Je devais faire 2 choses:

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

  2. Supprimez mvc: piloté par l'annotation du ressort XML. Impossible d'avoir à la fois la configuration XML et @EnableWebMvc. La classe globale ne fonctionnera pas sans @EnableWebMvc, par conséquent, mvc: piloté par les annotations doit être supprimé.

2
user9124560

Je suis confronté à un problème similaire. J'ai changé WebMvcConfigurerAdapter en WebMvcConfigurationSupport et cela a commencé à fonctionner.

En plus de cela, j'ai également déplacé le RequestMappingHandlerMapping défini dans le fichier de configuration XML vers la configuration Java.

1
Bharat Singh

Je pense que votre définition de mappage manque d'un *:

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

Sans ce * supplémentaire, cette configuration n'est pas mappée sur le chemin de requête /api/query/1121 (mais cela fonctionnerait sur /api/query/5).

0
Brian Clozel

J'avais un problème similaire et aucune des méthodes ne semblait fonctionner (à l'exception de l'utilisation de l'annotation @CrossOrigin pour chaque contrôleur). J'ai suivi la solution de Bharat Singh ci-dessus et après un débogage des composants internes de Spring Framework - voici ce qui a fonctionné pour moi (Spring Boot 2.0.6 + Spring Framework 5.0.10):

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

/* (non-Javadoc)
 * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
 */
@Override
protected void addCorsMappings(CorsRegistry registry) {
    //NOTE: servlet context set in "application.properties" is "/api" and request like "/api/session/login" resolves here to "/session/login"!
    registry.addMapping("/**")
        .allowedMethods("GET", "POST", "PUT", "DELETE")
        .allowedOrigins("*")
        .allowedHeaders("*")
        .allowCredentials(false);
    }
}

Initialement, lorsque j'ai utilisé le mappage "/api/**", il a été configuré dans Spring, mais depuis que l'application a été déployée avec le contexte "/api", des requêtes telles que "/api/session/login" ont été mappées en interne sur "/session/login" et un tel mappage dans la configuration CORS n'a pas été trouvé. Veuillez y porter attention!

0
Tomasz Poradowski