CORS mit Spring

CORS mit Frühling

1. Überblick

In jedem modernen Browser ist das Cross-Origin Resource Sharing (CORS) eine relevante Spezifikation, da HTML5- und JS-Clients auftauchen, die Daten über REST-APIs verbrauchen.

In vielen Fällen wird der Host, der das JS bedient (z. example.com) unterscheidet sich von dem Host, der die Daten bedient (z. api.example.com). In diesem Fall ermöglicht CORS die domänenübergreifende Kommunikation.

Spring bietet erstklassigesupport für CORS und bietet eine einfache und leistungsstarke Möglichkeit, diese in jeder Spring- oder Spring Boot-Webanwendung zu konfigurieren.

Weitere Lektüre:

401s mit CORS Preflights und Spring Security reparieren

Erfahren Sie, wie Sie den HTTP-Fehlerstatus 401 für CORS-Preflight-Anforderungen beheben

Read more

Spring Webflux und CORS

Eine schnelle und praktische Anleitung zur Arbeit mit CORS und Spring Webflux.

Read more

2. Controller-Methode CORS-Konfiguration

Das Aktivieren von CORS ist unkompliziert - fügen Sie einfach die Anmerkung@CrossOrigin hinzu.

Wir können dies auf verschiedene Arten umsetzen.

2.1. @CrossOrigin auf einer@RequestMapping-Annotated Handler-Methode

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

Im obigen Beispiel ist CORS nur für die Methoderetrieve() aktiviert. Wir können sehen, dass wir keine Konfiguration für die Annotation@CrossOriginfestgelegt haben, daher erfolgt die Standardkonfiguration:

  • Alle Ursprünge sind erlaubt

  • Die zulässigen HTTP-Methoden sind die in der Annotation@RequestMappingangegebenen (in diesem Beispiel GET).

  • Die Zeit, in der die Preflight-Antwort zwischengespeichert wird (maxAge)), beträgt 30 Minuten

2.2. @CrossOrigin auf dem Controller

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

Da@CrossOrigin zum Controller hinzugefügt wird, ist es sowohl für die Methodenretrieve() als auch fürremove()aktiviert. Wir können die Konfiguration anpassen, indem wir den Wert eines der Anmerkungsattribute angeben:origins,methods,allowedHeaders,exposedHeaders,allowCredentials odermaxAge.

2.3. @CrossOrigin an Controller- und Handler-Methode

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("http://example.com")
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

Spring kombiniert Attribute aus beiden Annotationen, um eine zusammengeführte CORS-Konfiguration zu erstellen.

In diesem Beispiel haben beide Methoden einenmaxAge von 3600 Sekunden, die Methoderemove() erlaubt alle Ursprünge, aber die Methoderetrieve() erlaubt nur Ursprünge vonhttp://example.com.

3. Globale CORS-Konfiguration

Als Alternative zur fein abgestimmten annotationsbasierten Konfiguration können wir in Spring einige globale CORS-Konfigurationen aus Ihren Controllern definieren. Dies ähnelt der Verwendung einer aufFilterbasierenden Lösung, kann jedoch in Spring MVC deklariert und mit einer feinkörnigen@CrossOrigin-Konfiguration kombiniert werden.

Standardmäßig sind alle Ursprungs- und GET-, HEAD- und POST-Methoden zulässig.

3.1. JavaConfig

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

Im obigen Beispiel werden CORS-Anforderungen von einem beliebigen Ursprung zu einem beliebigen Endpunkt in der Anwendung aktiviert.

Wenn wir dies etwas weiter sperren möchten, gibt dieregistry.addMapping-Methode einCorsRegistration-Objekt zurück, das für zusätzliche Konfigurationen verwendet werden kann. Es gibt auch eineallowedOrigins-Methode, mit der Sie ein Array zulässiger Ursprünge angeben können. Dies kann nützlich sein, wenn Sie dieses Array zur Laufzeit von einer externen Quelle laden müssen.

Darüber hinaus gibt esallowedMethods,allowedHeaders,exposedHeaders,maxAge undallowCredentials, mit denen die Antwortheader festgelegt und weitere Anpassungsoptionen bereitgestellt werden können .

3.2. XML-Namespace

Diese minimale XML-Konfiguration aktiviert CORS für das Pfadmuster eines/**mit denselben Standardeigenschaften wie die JavaConfig-Konfiguration:


    

Es ist auch möglich, mehrere CORS-Zuordnungen mit benutzerdefinierten Eigenschaften zu deklarieren:



    

    

4. Wie es funktioniert

CORS-Anforderungen werden automatisch an die verschiedenen registriertenHandlerMappingsgesendet. Sie verarbeiten CORS-Preflight-Anforderungen und fangen einfache und tatsächliche CORS-Anforderungen mithilfe der Implementierung vonCorsProcessorab (standardmäßigDefaultCorsProcessor), um die relevanten CORS-Antwortheader (z. B.Access-Control-Allow-Origin) hinzuzufügen.

MitCorsConfiguration kann angegeben werden, wie die CORS-Anforderungen verarbeitet werden sollen: zulässige Ursprünge, Header und Methoden unter anderem. Dies kann auf verschiedene Arten bereitgestellt werden:

  • AbstractHandlerMapping#setCorsConfiguration() ermöglicht die Angabe einesMap mit mehrerenCorsConfigurations, die Pfadmustern wie/api/** zugeordnet sind

  • Unterklassen können ihre eigenenCorsConfiguration bereitstellen, indem sie dieAbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)-Methode überschreiben

  • Handler können dieCorsConfigurationSource-Schnittstelle implementieren (wie dies jetzt beiResourceHttpRequestHandler der Fall ist), um für jede Anforderung einCorsConfiguration bereitzustellen

5. Fazit

In diesem Artikel haben wir gezeigt, wie Spring die Aktivierung von CORS in unserer Anwendung unterstützt.

Wir haben mit der Konfiguration des Controllers begonnen. Wir haben gesehen, dass wir nur die Annotation@CrossOrigin hinzufügen müssen, um CORS entweder für eine bestimmte Methode oder für den gesamten Controller zu aktivieren.

Schließlich haben wir auch gesehen, dass wir, wenn wir die CORS-Konfiguration außerhalb der Controller steuern möchten, dies problemlos in den Konfigurationsdateien durchführen können - entweder mit JavaConfig oder XML.

Der vollständige Quellcode für die Beispiele istover on GitHub verfügbar.