Spielen! 2.4: Wie können CORS vom Ursprungs-Datei://

Ich bin mit spielen 2.4, um eine öffentliche REST-API. Ich fügte hinzu, die CORS-filter, so dass alle Ursprünge und Header.

Sehen von der Anwendung.conf:

play.filters {
  # CORS filter configuration
  cors {

    # The path prefixes to filter.
    pathPrefixes = ["/"]

    # The allowed origins. If null, all origins are allowed.
    allowedOrigins = null

    # The allowed HTTP methods. If null, all methods are allowed
    allowedHttpMethods = null

    # The allowed HTTP headers. If null, all headers are allowed.
    allowedHttpHeaders = null

    # The exposed headers
    exposedHeaders = []

    # Whether to support credentials
    supportsCredentials = true

    # The maximum amount of time the CORS meta data should be cached by the client
    preflightMaxAge = 1 hour
  }
}

Funktioniert es völlig in Ordnung, wenn ich rufen Sie die API von einem Klassiker browser (chrome/firefox getestet), unabhängig von der Herkunft, da darf ich alles.

ABER wenn ich versuche zu nennen, bilden Sie eine cordova-Anwendung (in cordova apps, die Herkunft von ajax-Anfragen sind file://), bekomme ich einen CORS-Fehler: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'file://' is therefore not allowed access. The response had HTTP status code 403. Als wenn ich nicht damit origin 'file://'

Habe ich versucht, Sie zu konsumieren eine andere API, mit der CORS (GET https://public.opencpu.org/ocpu/library/), um zu überprüfen, ob es nicht cordova, die blockiert die Anfrage, aber es hat gut funktioniert. Also ich denke das problem kommt aus dem Spiel.

Ich versuchte, zu allowedOrigins = ["file://"] aber es funktioniert auch nicht...

Jede Hilfe bitte?

EDIT: Dies ist nicht ein Duplikat von Cross-origin BEKOMMEN von lokalen file:// : ich kann nicht installieren Sie einen webserver, da dies eine cordova-Anwendung. Die Dateien werden Ihnen vom Telefon/tablet-PC-Datei-system, um die WebView.
Dies ist ein Spiel-framework-spezifische Frage, ich habe keine Probleme mit einer älteren version. Vielleicht sind die Standard-CorsFilter geändert werden kann, damit origin file://

EDIT 2: Nachdem es gefordert wurde, hier die (sehr einfachen) code, den ich verwenden für meine eigene scala-filter.

//CORSFilter.scala
package filters
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.mvc._
import play.mvc.Http

/**
  * Allow CORS from anywhere, any method
  */
class CORSFilter extends EssentialFilter {
  def apply(nextFilter: EssentialAction) = new EssentialAction {
    def apply(requestHeader: RequestHeader) = {
        nextFilter(requestHeader)
          .map { result =>
            if (requestHeader.method.equals("OPTIONS")) {
              Results.Ok.withHeaders(
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN -> "*",
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_HEADERS -> "X-Requested-With, Accept, Content-Type",
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_METHODS -> "HEAD,GET,POST,PUT,PATCH,DELETE")
            } else {
              result.withHeaders(
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN -> "*",
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_HEADERS -> "X-Requested-With, Accept, Content-Type",
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_METHODS -> "HEAD,GET,POST,PUT,PATCH,DELETE",
                Http.HeaderNames.ACCESS_CONTROL_EXPOSE_HEADERS -> "X-Custom-Header-To-Expose")
            }
          }
    }
  }
}

Beachten Sie, dass ich nur diese in der Entwicklung-Modus und es hat einige Probleme. Zum Beispiel, wenn eine Ausnahme nicht gefangen Laufzeit, die Antwort wird nicht die CORS-Header, da der filter nicht angewendet wird. Aber wenn dies für eine cordova-Anwendung, sollte es funktionieren, das fein genug ist.

  • Was macht Ihr cordova-Umsetzung-code Aussehen?
  • Hallo, dies ist ein Duplikat von: stackoverflow.com/questions/8192159/...
  • Ich markiert es für Sie 🙂
  • Installation eines lokalen web-server......es gibt viele Möglichkeiten, es zu tun, und es dauert nicht lange,
  • Dies ist nicht eine doppelte Saar, meine Frage ist, spielen bestimmte. Ich will einfach nur, um zu autorisieren Anfragen von origin file://, das funktioniert in älteren Versionen. Ich kann nicht einen lokalen server installieren, da dies eine cordova-Anwendung charlitfl, eingereicht werden serviert von den mobilen Datei-system, um die WebView
  • Beachten Sie das "Die Antwort hatte Sie den HTTP-status-code 403" - Meldung. Ich bin unter dem Eindruck, dass das Spiel explizit gibt einen 403-Fehler, wenn eine Anfrage kommt vom Ursprung 'null' oder 'file://'
  • seine nicht zu duplizieren, und ich habe das gleiche Problem, endete mit dieser Frage.
  • Hast du jemals das gelöst? Haben Sie jemals versucht zu entfernen, origin-header von cordova/webview XMLHttpRequest?
  • es gibt keine Möglichkeit zum entfernen der header aus dem request gesendet von cordova. Verwenden Sie einfach die ausgewählte Antwort unten. Ihr Spiel-server ermöglichen sollte CORS. Oder Sie können mit nginx oder apache zu ändern, die Herkunft, das ist wohl die sauberste Lösung

InformationsquelleAutor SebT | 2015-09-10
Schreibe einen Kommentar