Möglicherweise wird die folgende Fehlermeldung angezeigt:
wurde durch CORS-Richtlinie blockiert: Auf der angeforderten Ressource ist kein „Access-Control-Allow-Origin“-Header vorhanden
Dieser Fehler weist darauf hin, dass eine Anfrage an eine bestimmte Adresse vom CORS-Protokoll blockiert wurde, weil der Access-Control-Allow-Origin-Header in der Ressource fehlt.
Die Hauptursache für Cross-Origin-Probleme liegt darin, dass Browser aus Sicherheitsgründen den Zugriff auf Ressourcen außerhalb der aktuellen Site einschränken.
Stellen Sie sich zum Beispiel eine Website vor, die unter http://127.0.0.1:8080/ mit einer bestimmten Seite gehostet wird. Wenn Sie von derselben Site aus auf Ressourcen zugreifen, gibt es keine Einschränkungen. Wenn Sie jedoch versuchen, von einer anderen Site aus auf Ressourcen zuzugreifen (z. B. http://127.0.0.1:8081), blockiert der Browser die Anfrage.
Hinweis: Wir betrachten Protokoll, Domäne und Port als Teil der Definition eines „gleichen Ursprungs“.
Elemente mit einem src-Attribut, wie img- und script-Tags, unterliegen dieser Einschränkung nicht.
In der Vergangenheit, als Front-End und Back-End nicht getrennt waren, existierten Seiten und Anforderungsschnittstellen unter derselben Domäne und demselben Port. Browser würden dann Anfragen von einer Seite, die in einer Domain gehostet wird, erlauben, Ressourcen von derselben Domain anzufordern.
Zum Beispiel kann http://127.0.0.1:8080/index.html http://127.0.0.1:8080/a/b/c/userLit frei anfordern.
Heutzutage, da Front-End und Back-End in verschiedene Anwendungen getrennt sind, ist dies nicht zulässig und führt zu CORS-Problemen.
Ursprung (oder Quelle) besteht aus dem Protokoll, der Domäne und der Portnummer.
Eine URL besteht aus Protokoll, Domäne, Port und Pfad. Zwei URLs gelten als „gleicher Ursprung“, wenn ihr Protokoll, ihre Domäne und ihr Port alle identisch sind. Jeder Unterschied in einem dieser drei Elemente stellt eine Cross-Origin-Anfrage dar.
Erwägen Sie ursprungsübergreifende Vergleiche für https://www.baidu.com/index.html:
URL | Cross-Origin | Grund |
---|---|---|
https://www.baidu.com/more/index.html | NEIN | Gleiches Protokoll, gleiche Domäne und gleicher Port |
https://map.baidu.com/ | Ja | Andere Domain |
http://www.baidu.com/index.html | Ja | Anderes Protokoll |
https://www.baidu.com:81/index.html | Ja | Anderer Port |
Die Same-Origin-Richtlinie ist eine grundlegende Browser-Sicherheitsfunktion. Ohne sie könnte die normale Funktionalität von Browsern gefährdet sein. Die Webarchitektur hängt stark von dieser Richtlinie ab und Browser implementieren sie, um die Sicherheit zu gewährleisten.
Die Same-Origin-Richtlinie umfasst:
In einem Projekt, bei dem Front-End und Back-End getrennt bereitgestellt werden, ist die Bewältigung von CORS von entscheidender Bedeutung. Cookies werden zum Speichern von Benutzeranmeldeinformationen verwendet und Spring-Interceptors verwalten Berechtigungen. Probleme treten auf, wenn der Interceptor und CORS in der falschen Reihenfolge verarbeitet werden, was zu einem CORS-Fehler führt.
Eine HTTP-Anfrage durchläuft zunächst den Filter, bevor sie das Servlet und dann den Interceptor erreicht. Um sicherzustellen, dass die CORS-Verarbeitung vor dem Abfangen der Autorisierung erfolgt, können wir die CORS-Konfiguration in einen Filter einfügen.
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
Während JSONP ursprungsübergreifende Probleme im Front-End beheben kann, unterstützt es nur GET-Anfragen, was in RESTful-Anwendungen eine Einschränkung darstellt. Stattdessen können Sie ursprungsübergreifende Anfragen mit Cross-Origin Resource Sharing (CORS) im Back-End bearbeiten. Diese Lösung gibt es nicht nur bei Spring Boot, sondern wurde auch in herkömmlichen SSM-Frameworks verwendet. Sie konfigurieren es, indem Sie die WebMvcConfigurer-Schnittstelle implementieren und die addCorsMappings-Methode überschreiben.
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
Sie können CORS für bestimmte Controller-Methoden aktivieren, indem Sie die Annotation @CrossOrigin zur Annotation @RequestMapping hinzufügen. Standardmäßig lässt @CrossOrigin alle in @RequestMapping angegebenen Ursprünge und HTTP-Methoden zu.
@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
Verstehen von @CrossOrigin-Parametern:
Beispiel:
@CrossOrigin @RestController public class PersonController { @RequestMapping(method = RequestMethod.GET) public String add() { // some code } }
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3