Spring Global CORS-Konfiguration nicht funktioniert, aber Controller-Ebene config nicht
Ich versuche zu konfigurieren CORS weltweit über WebMvcConfigurerAdapter
unten dargestellt. Um zu testen, ich bin schlug meinen API-Endpunkt über einen kleinen Knoten app, die ich erstellt zum emulieren eines externen Dienstleisters. Wenn ich versuche, diesem Ansatz die Antwort enthält nicht die korrekten Header und schlägt mit
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);
}
}
Wenn ich mir jedoch nutzen die @CrossOrigin
annotation wie also funktioniert es ganz gut reagiert mit dem richtigen Header.
@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 bin ich, um die Globale config-Arbeit (folgte den Anweisungen hier https://spring.io/blog/2015/06/08/cors-support-in-spring-framework). Ich fühle mich wie ich bin etwas fehlt einfach, da die Notierung der controller funktioniert Prima.
- Vielleicht
.allowedOrigins("*").allowedHeaders("*")
sind überflüssig in der globalen Konfiguration - Hast du es herausfinden? Ich bin auch mit diesem Problem. Versucht, Antworten aber nicht Arbeit für mich...
- Ich war im selben Boot wie du, aber geschafft, etwas zu bekommen, zu arbeiten. Haben Sie einen Blick auf meine Antwort hier: stackoverflow.com/a/55629589/5877810
Du musst angemeldet sein, um einen Kommentar abzugeben.
Damit die Globale CORS config funktioniert, muss der client fügen Sie diese beiden Header in der OPTIONS-Anfrage.
Aber die @CrossOrigin annotation erfordert nur die "Origin" - header.
Ihr Kunde wahrscheinlich fügt der "Origin" - header fehlt aber die "Access-Control-Request-Methode".....das ist, warum es für Sie arbeitet mit der @CrossOrigin, aber nicht mit der global config.
du nicht deklarierte Methode, die per default annehmen nur get-Methode.
versuchen
registry.allowedMethods("*");
Konnte ich mir die Spring Global CORS-Konfiguration zu arbeiten, nachdem er die genaue problem dokumentiert in dieser Ausgabe. Ich hatte 2 Sachen zu machen:
allowedOrigins werden kann * wenn allowCredentials wahr ist. Dies ist dokumentiert bei Mozilla.org
Entfernen mvc:annotation-driven aus der Frühjahr XML. Ist nicht die XML-config und @EnableWebMvc. Die Globale Klasse wird nicht funktionieren, ohne @EnableWebMvc, so mvc:annotation-driven entfernt werden müssen.
Ich Stand vor ähnlichen Problem. Ich habe die WebMvcConfigurerAdapter zu WebMvcConfigurationSupport und es begann zu arbeiten.
Zusätzlich dazu habe ich auch verschoben, das RequestMappingHandlerMapping definiert in der xml-Konfiguration-Datei der java-Konfiguration.
Ich habe gerade mit der exakt gleichen Problem, mit keiner der Lösungen in diesem thread zu arbeiten. Ich habe es geschafft, es zu lösen mit den folgenden:
Einer neuen Konfiguration bean:
Eine änderung an meinem web.xml um einen neuen filter hinzufügen, die für alle URLs:
Natürlich können Sie ändern Sie die cors-config entsprechend.
Ich denke, dein mapping-definition fehlt, ist ein
*
:Ohne dass zusätzliche
*
diese Konfiguration nicht zugeordnet ist, um die/api/query/1121
Anfrage Weg (aber es würde funktionieren auf/api/query/5
)."/api/query/**"
und es hat nicht funktioniert. Ursprünglich hatte ich sogar ein 'Hallo Welt' geben Sie die Implementierung mitregistry.addMapping("/**")
, und dass nicht die einen Unterschied machen.. muss ich irgendwie angeben, dass es auf port 8080? Ich weiß auch nicht ... es sieht aus wie es funktionieren sollteIch hatte ein ähnliches Problem und keine der Methoden scheint zu funktionieren (außer mit
@CrossOrigin
annotation für jeden controller). Ich folgte Bharat Singh Lösung oben und nach einigem Debuggen von Spring Framework - Interna- hier ist was für mich gearbeitet (Spring-Boot-2.0.6 + Spring Framework 5.0.10):Zunächst, als ich verwendet
"/api/**"
mapping konfiguriert wurde, in den Frühling, aber da die Anwendung bereitgestellt wurde, mit"/api"
Kontext - Anfragen wie"/api/session/login"
wurden intern zugeordnet"/session/login"
und solche Zuordnung in CORS-Konfiguration wurde nicht gefunden - bitte beachten Sie, dass!Ich Stand vor dem gleichen Problem und nach der Einstellung der maxAge Attribut alles angefangen zu arbeiten, ok!
wenn Sie das Kontrollkästchen CrossOrigin annotation hat einen Standardwert zugewiesen, das Attribut