2014-04-30 15 views
6

Stavo tentando di implementare il supporto CORS su un server Spray (versione 1.1-20131011 in cui le intestazioni cors sono già supportate).Le intestazioni di risposta CORS non funzionano in Spray quando richiesto dal browser

Attualmente, il codice del server è simile al seguente:

trait DefaultCORSDirectives { this: Directives => 
    def defaultCORSHeaders = respondWithHeaders(
     `Access-Control-Allow-Origin`(AllOrigins), 
     `Access-Control-Allow-Methods`(HttpMethods.GET, HttpMethods.POST, HttpMethods.OPTIONS, HttpMethods.DELETE, 
     HttpMethods.CONNECT, HttpMethods.DELETE, HttpMethods.HEAD, HttpMethods.PATCH, HttpMethods.PUT, HttpMethods.TRACE), 
     `Access-Control-Allow-Headers`("Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Accept-Language, Host," + 
    " Referer, User-Agent, Overwrite, Destination, Depth, X-Token, X-File-Size, If-Modified-Since, X-File-Name, Cache-Control"), 
     `Access-Control-Allow-Credentials`(true), 
     `Access-Control-Max-Age`(3600) 
    ) 
} 

ed è usato come questo

defaultCORSHeaders { 
     options { 
     complete { 
      StatusCodes.OK 
     } 
     } ~ 
     post { 
     path("path") { 
      //response 
     } 
    } 

Le risposte sia per POST e opzioni metodi sono come previsto quando si utilizza ricciolo. Tuttavia dal browser, ottengo che Origin non è consentito da Access-Control-Allow-Origin (Chrome) o Error 415 Tipo di supporto non supportato (Firefox) e sembra che la richiesta POST non sia nemmeno stata inviata.

Il codice jQuery che richiede è semplicemente la seguente:

$(document).ready(function() { 
     $.post(url, 
      { 
       'params': "params", 
      }, 
      function (data) { 
       //handle response 
      } 
    ); 
}); 

Ho letto le specifiche CORS e tutte le risorse che ho trovato, ha tentato ogni possibile combinazione di intestazioni Access-Control-Allow- (con e senza Access-Control-Allow-Credentials, contenuto diverso di Access-Control-Allow-Headers e Access-Control-Allow-Methods, Access-Control-Allow-Origin impostato su * o la singola Origin ecc.). Ho anche provato a eseguire lo script da disco (Origine null), webserver (Origin localhost: 8888) e server remoto (URL standard di origine), perché alcuni browser apparentemente bloccano richieste con origine locale, ma sempre lo stesso risultato negativo.

Qualsiasi aiuto su come ottenere questo funzionamento sarebbe molto apprezzato.

+0

risolto ancora? – Phil

risposta

2

Se si dispone dell'autorizzazione nella propria API, è necessario includere l'intestazione Autorizzazione in Access-Control-Allow-Headers.

L'unico modo per testare cors da arricciamento è se si utilizza l'intestazione Origine: curl cors

3

Non ho usato una direttiva, ma ho provato rawheader e funziona.

codice

è la seguente:

path("ping"){ 
    get{ 
    respondWithMediaType(`application/json`){ 
     respondWithHeader(RawHeader("Access-Control-Allow-Origin","*")){ 
     complete{ 
      jsonPrefix + """{"result": "PONG"}""" 
     } 
     } 
    } 
    } 
} 
0

Dichiarazione di una nuova direttiva:

trait CORSSupport extends Directives { 
    private val CORSHeaders = List(
    `Access-Control-Allow-Methods`(GET, POST, PUT, DELETE, OPTIONS), 
    `Access-Control-Allow-Headers`("Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Accept-Language, Host, Referer, User-Agent"), 
    `Access-Control-Allow-Credentials`(true) 
    ) 

    def respondWithCORS(origin: String)(routes: => Route) = { 
    val originHeader = `Access-Control-Allow-Origin`(SomeOrigins(Seq(HttpOrigin(origin)))) 
    respondWithHeaders(originHeader :: CORSHeaders) { 
     routes ~ options { complete(StatusCodes.OK) } 
    } 
    } 
} 

Facendo uso della nuova direttiva:

trait Api extends Directives with RouteConcatenation with CORSSupport with ConfigHolder{ 
    this: CoreActors with Core => 

    val routes = 
     respondWithCORS(config.getString("origin.domain")) { 

     pathPrefix("api") { 
      new DemoRoute().route 
     } 
     } 

    val rootService = system.actorOf(ApiService.props(config.getString("hostname"), config.getInt("port"), routes)) 
    } 

https://github.com/wesovilabs/spray-cors-demo/blob/master/README.md