2014-06-17 8 views
5

Ich möchte einen CORS-Filter in meiner Play 2.2.x-Anwendung implementieren. Bisher habe ich folgende:CORS Filter in Scala Play 2.2 Anwendung

package filters 

import play.api.mvc._ 
import play.api.libs.concurrent.Execution.Implicits.defaultContext 
import play.api.GlobalSettings 

class CorsFilter extends EssentialFilter { 
    def apply(next: EssentialAction) = new EssentialAction { 
    def apply(requestHeader: RequestHeader) = { 
     next(requestHeader).map { result => 
     result.withHeaders("Access-Control-Allow-Origin" -> "*", 
      "Access-Control-Expose-Headers" -> "WWW-Authenticate, Server-Authorization", 
      "Access-Control-Allow-Methods" -> "POST, GET, OPTIONS, PUT, DELETE", 
      "Access-Control-Allow-Headers" -> "x-requested-with,content-type,Cache-Control,Pragma,Date") 
     } 
    } 
    } 
} 

object Global extends WithFilters(new CorsFilter) with GlobalSettings 

sowie eine Preflight-Optionen Aktion:

def preflight(all: String) = Action { 
    Ok("").withHeaders("Access-Control-Allow-Origin" -> "*", 
     "Allow" -> "*", 
     "Access-Control-Allow-Methods" -> "POST, GET, PUT, DELETE, OPTIONS", 
     "Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept, Referrer, User-Agent"); 
    } 

mit einer Route definiert:

OPTIONS  /*all        controllers.Application.preflight(all: String) 

Was passiert zu sein scheint, ist, dass CorsFilter Code wird nicht ausgeführt. Ich habe meinen Debugger geöffnet und ich sehe keine meiner Anfragen, die diesen Filter schlagen. Warum sollte das sein? Gibt es irgendwo anders, wo ich das Filtermaterial definieren muss, damit Play es sehen kann?

Antwort

3

Das Objekt GlobalSettings muss im Standardpaket enthalten sein, sodass package filters dafür sorgt, dass es von Play ignoriert wird. Ich würde vorschlagen, es in seine eigene Datei zu verschieben Global.scala.

+0

Wow, das funktioniert. Ich verbrachte so viel Zeit damit, herauszufinden, was das Problem war, das wäre der letzte Ort gewesen, an den ich gedacht hätte. Ist das irgendwo dokumentiert? – jcm

+0

Ja: http://www.playframework.com/documentation/2.3.x/ScalaGlobal –

+1

Siehe auch http://www.playframework.com/documentation/2.3.x/SecurityHeaders obwohl Hinweis https://github.com/ playframework/playframework/Probleme/2967 # issementcomment-45949778 –

3

Bei einem ähnlichen Projekt, bei dem versucht wurde, einen AngularJS-Webclient mit einem Scala-Server zu kommunizieren, funktionierten die verwendeten Header nicht. Wir verwendeten:

ACCESS_CONTROL_ALLOW_ORIGIN -> "*", 
    ACCESS_CONTROL_ALLOW_METHODS -> "GET, POST, OPTIONS", 
    ACCESS_CONTROL_ALLOW_HEADERS -> "Origin, Accept, Authorization, X-Auth-Token", 
    ACCESS_CONTROL_ALLOW_CREDENTIALS -> "true" 

Wir hatten das globale Objekt in einer eigenen Datei wie LimbSoup vorgeschlagen. Wir haben die Hauptstütze des Codes von https://gist.github.com/jeantil/7214962 ausgeliehen, aber die Header fest programmiert, anstatt sie programmatisch zu implementieren.

Verwandte Themen