2016-07-11 15 views
2

Ich versuche, CORS-Header für meine Spiel-Framework-App zu setzen. Ich erhalte speziell diesen FehlerPlay Framework CORS Header

cannot load http://127.0.0.1:9000/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. 

Ich dachte, ich dies leicht, indem Sie folgende Anweisungen umgehen konnte: https://www.playframework.com/documentation/2.5.x/CorsFilter

Doch nach dies zu tun. nichts hat sich verändert.

curl -I localhost:9000/ 
HTTP/1.1 200 OK 
Content-Length: 4540 
Content-Type: text/html; charset=utf-8 
Date: Mon, 11 Jul 2016 20:03:33 GMT 

Meine conf ist:

play.http.filters = "global.Filters" 

play.filters.cors { 
    allowedOrigins = ["http://www.example.com", "*"] 
    allowedHttpMethods = ["GET", "POST"] 
    allowedHttpHeaders = ["Accept"] 
} 

und meine Filters.scala Datei ist:

package global 

import javax.inject.Inject 
import play.api.http.DefaultHttpFilters 
import play.filters.cors.CORSFilter 

class Filters @Inject() (corsFilter: CORSFilter) 
    extends DefaultHttpFilters(corsFilter) 

Wenn mir jemand sagen könnte, warum die Filter scheinen nicht zu bekommen angewendet werden die Antworten, das wäre großartig.

Antwort

5

Spielfilter sind verlockend, aber wenn sie nicht wie erwartet funktionieren, wie Sie bemerkt haben, ist die Magie nicht so einfach zu finden.

ziehe ich es um so etwas zu verwenden:

implicit class RichResult (result: Result) { 
    def enableCors = result.withHeaders(
    "Access-Control-Allow-Origin" -> "*" 
    , "Access-Control-Allow-Methods" -> "OPTIONS, GET, POST, PUT, DELETE, HEAD" // OPTIONS for pre-flight 
    , "Access-Control-Allow-Headers" -> "Accept, Content-Type, Origin, X-Json, X-Prototype-Version, X-Requested-With" //, "X-My-NonStd-Option" 
    , "Access-Control-Allow-Credentials" -> "true" 
) 
} 

Dann können Sie diese leicht wie dies in Ihrer Antwort aufrufen:

Ok(Json.obj("ok" -> "1")).enableCors 

Es ist leicht zu verstehen, nur platziert werden können, wo Sie wollen um CORS zu aktivieren und sehr einfach zu debuggen!

1

Ich würde nicht empfehlen, schreiben/mit irgendeinem Code zu aktivieren CORS, die im Grunde eine Framework-Funktion ist und nur Konfiguration benötigt.

Das Material, das Sie aus der Dokumentation kopiert korrekt ist:

  • cors.conf, wo Sie die play.filters.cors Einstellungen ändern. Aber Sie scheinen etwas falsch konfiguriert zu haben, z.B. Die allowedOrigin = * sollte als null in der Konfig konfiguriert werden. (Werfen Sie einen Blick auf die documentation page und der verknüpften reference.conf)

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

  • Sie haben richtig die CORSFilter in Ihrem Filters.scala
  • nun Ihre Konfiguration testen mit einer korrekten cURL CORS Anfrage aktiviert:

curl -H "Origin: http://example.com" \ -H "Access-Control-Request-Method: GET" \ -H "Access-Control-Request-Headers: X-Requested-With" \ -X OPTIONS --verbose \ http://localhost:9000/

0

für mich gearbeitet es nach einem Tag (vielleicht Bargeld oder andere Dinge)

application.conf:

play.http.filters = "filters.Filters" 

play.filters.cors { 
    # allow all paths 
    pathPrefixes = ["/"] 
# allow all origins (You can specify if you want) 
allowedOrigins = null 
allowedHttpMethods = ["GET", "POST"] 
# allow all headers 
allowedHttpHeaders = null 
} 

bauen.sbt:

val appDependencies = Seq(
filters, 
.... 
) 

in Paket filters.Filter:

package filters; 

import javax.inject.Inject; 
import play.mvc.EssentialFilter; 
import play.filters.cors.CORSFilter; 
import play.http.DefaultHttpFilters; 

public class Filters extends DefaultHttpFilters { 

CORSFilter corsFilter; 

@Inject 
public Filters(CORSFilter corsFilter) { 
    super(corsFilter); 
    this.corsFilter = corsFilter; 
    } 

public EssentialFilter[] filters() { 
    return new EssentialFilter[] { corsFilter.asJava() }; 
} 
} 

und in meinem Ajax-Aufruf:

$.ajax({ 
    method:'GET', 
    url: xxxxxxxx', 
    dataType: 'json', 
    headers: {'url': yyyyy, 
    'Access-Control-Allow-Origin': '*', 
    'Access-Control-Allow-Methods': 'GET, POST, PUT', 
    'Access-Control-Allow-Headers': 'Content-Type' 
    }, 
    success: function(data) { 
....}); 

ich habe keine Fehler mehr, in prod und in der lokalen Umgebung !! danke dir allen