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.
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.
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("*");
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:
allowedOrigins ne peut pas être * si allowCredentials est true. Ceci est documenté sur Mozilla.org
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é.
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.
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
).
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!