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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, das problem kommt von diesem code-Zeile in das Play framework: https://github.com/playframework/playframework/blob/master/framework/src/play-filters-helpers/src/main/scala/play/filters/cors/AbstractCORSPolicy.scala#L322
Als URI 'file://', domain/host der URI ist null, so
new URI
wirft einen Fehler und dann das Spiel wieder einen 403-Fehler. Um dies zu beheben müssen wir den patch framework oder versuchen zu ändern, die den Ursprung der 'file://'.Fand ich einen workaround für mein Anwendungsfall: deaktivieren CORS auf Play. Wenn ich dann mithilfe von ajax aus meine cordova-app, die Herkunft nicht geprüft.
Das problem mit dieser Problemumgehung ist, dass wenn ich es aktivieren will CORS auf meinem Spiel-Projekt für einen Grund, die cordova app wird nicht funktionieren, da das Spiel überprüfen der Herkunft und ablehnen.