2016-06-23 1 views
18

Ich versuche, CORS global über WebMvcConfigurerAdapter unten dargestellt konfigurieren. Um zu testen, triff ich meinen API-Endpunkt über eine kleine Knoten-App, die ich erstellt habe, um einen externen Dienst zu emulieren. Wenn ich versuche, diesen Ansatz nicht die Antwort nicht die richtigen Header enthält und nicht mitSpring Globale CORS-Konfiguration funktioniert nicht, aber Controller-Level-Konfig tut

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. 

Globale 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); 
     } 
} 

Allerdings, wenn ich die @CrossOrigin Annotation verwenden wie so funktioniert es ganz gut mit den richtigen Header reagiert .

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

Produziert

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

Was ich die globale Konfigurations Arbeit zu machen fehle (Anweisungen hier https://spring.io/blog/2015/06/08/cors-support-in-spring-framework gefolgt). Ich habe das Gefühl, dass ich etwas Einfaches verpasse, da das Annotieren des Controllers gut funktioniert.

+0

Vielleicht '.allowedOrigins (" * ").allowedHeaders ("*") 'sind redundant in der globalen Konfiguration –

Antwort

0

Ich denke, Ihre Mapping-Definition ist ein * fehlt:

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

Ohne diese zusätzlichen *, wird diese Konfiguration nicht zugeordnet auf den /api/query/1121 Anforderungspfad (aber es funktionieren würde auf /api/query/5).

+1

Vielen Dank für Ihre Antwort, ich habe auch versucht' "/ api/query/**" 'und es hat nicht funktioniert. Ursprünglich hatte ich sogar eine Hallo-Welt-Implementierung mit 'registry.addMapping ("/** ") und das machte keinen Unterschied. Muss ich irgendwie angeben, dass es sich um Port 8080 handelt? Ich weiß nicht einmal ... es sieht so aus, als ob es gut funktionieren sollte –

4

Sie haben keine Methode deklariert, die standardmäßig nur die Methode get akzeptiert. versuchen registry.allowedMethods("*");

+0

Ich bin mit dem gleichen Problem mit der POST-Methode konfrontiert. Es wurde durch Hinzufügen von erlaubten Methoden gelöst. –

7

Damit die globale CORS-Konfiguration funktioniert, muss der Client diese beiden Header in der OPTIONS-Anfrage hinzufügen.

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

jedoch die @CrossOrigin Anmerkung nur die "Origin" Header erfordert.
Ihr Client fügt wahrscheinlich den "Origin" -Header hinzu, aber es fehlt die "Access-Control-Request-Methode" ..... deshalb funktioniert es für Sie mit der @CrossOrigin, aber nicht mit der globalen Konfiguration.

0

Ich konfrontiert ähnliches Problem. Ich habe den WebMvcConfigurerAdapter zu WebMvcConfigurationSupport geändert und er hat angefangen zu arbeiten.

Darüber hinaus habe ich auch das RequestMappingHandlerMapping, das in der XML-Konfigurationsdatei definiert wurde, in die Java-Konfiguration verschoben.

0

Ich war in der Lage, die Spring Global CORS-Konfiguration zu funktionieren, nachdem das genaue Problem in diesem Problem dokumentiert wurde. Ich musste 2 Sachen machen:

  1. erlaubteOrigins kann nicht sein * wenn allowCredentials ist wahr. Dies ist dokumentiert unter Mozilla.org

  2. Entfernen Sie mvc: Annotation-getrieben von der Feder XML. Kann nicht die XML-Konfiguration und @EnableWebMvc haben. Die globale Klasse funktioniert nicht ohne @EnableWebMvc, daher muss mvc: annotation-driven entfernt werden.

Verwandte Themen