2014-06-17 4 views
5

Desidero implementare un filtro CORS nell'applicazione Play 2.2.x. Finora ho il seguente:Filtro CORS nell'applicazione Scala Play 2.2

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 

così come una verifica preliminare azione di opzioni:

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"); 
    } 

con un percorso definito:

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

cosa sembra accadere è che il codice CorsFilter non viene eseguito Ho il mio debugger aperto e non vedo nessuna delle mie richieste che colpisce questo filtro. Perché dovrebbe essere? C'è qualche altra cosa che devo definire il filtro in modo che Play possa vederlo?

risposta

3

L'oggetto GlobalSettings deve essere nel pacchetto predefinito, quindi package filters sta provocando l'ignorato da Play. Suggerirei di spostarlo nel proprio file Global.scala.

+0

Wow, funziona. Ho passato così tanto tempo a cercare di capire quale fosse il problema, questo sarebbe stato l'ultimo posto in cui avrei pensato. È documentato da qualche parte? – jcm

+0

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

+1

Vedere anche http://www.playframework.com/documentation/2.3.x/SecurityHeaders anche se nota https://github.com/ play framework/play framework/temi/2967 # issuecomment-45.949.778 –

3

Per un progetto simile, cercando di ottenere un client Web AngularJS in comunicazione con un server Scala, le intestazioni utilizzate non funzionavano. Abbiamo utilizzato:

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" 

Abbiamo avuto l'oggetto Global nel proprio file come suggerito da LimbSoup. Abbiamo preso in prestito il pilastro del codice da https://gist.github.com/jeantil/7214962 ma abbiamo codificato le intestazioni invece di implementarle a livello di codice.