2013-02-11 2 views

ответ

2

Не уверен, что это означает 2.x, но в 1.2.5 я делаю это. Заголовок Access-Control-Allow-Headers является необязательным, если у вас есть нестандартные заголовки. Вы можете изменить * Разрешить-Происхождение, чтобы соответствовать доменам, которые вы хотите разрешить.

@Before 
static void CORS() { 
    if(request.headers.containsKey("origin")){ 
     response.headers.put("Access-Control-Allow-Origin", new Header("Access-Control-Allow-Origin", "*")); 
     response.headers.put("Access-Control-Allow-Headers", new Header("Access-Control-Allow-Headers", "my-custom-header, my-second-custom-header")); 
    } 
} 

Если у вас есть нестандартные методы (GET/POST) или использовать пользовательские заголовки, большинство агентов пользователя будет иметь предполетный Парам.вызовов, так что вы, что я сделать, это добавить это в мой файл маршрутов:

#This catches the preflight CORS calls 
OPTIONS /{path}         Application.options 

и это в моем контроллере:

/** 
* Cross Origin Request Sharing calls are going to have a pre-flight option call because we use the "non simple headers" 
* This method catches those, (headers handling is done in the CORS() method) 
*/ 
public static void options() {} 
2

Использование языка Scala, приятный и простое решение PlayFramework может быть с помощью следующей ActionBuilder

import play.api.mvc._ 
import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 

// An Actionbuilder for CORS - Cross Origin Resource Sharing 
object CorsAction extends ActionBuilder[Request] { 

    def invokeBlock[A](request: Request[A], block: (Request[A]) ⇒ Future[SimpleResult]): Future[SimpleResult] = { 
    block(request).map { result => 
     request.headers.get("Origin") match { 
     case Some(o) => result.withHeaders("Access-Control-Allow-Origin" -> o) 
     case None => result 
     } 
    } 
    } 
} 

ActionBuilder переопределяет метод invokeBlock с целью сопоставления результата, созданного действием вашего контроллера приложения (завернутого объектом Future в Play> = 2.1), в тот же результат с дополнительным «Access-Control-Allow -Origin ", если запрос пришел с полем заголовка" Origin ".

выше действия строитель может быть использован просто следующим образом:

object MyController extends Controller { 

    def myAction = CorsAction { 
    Ok("whatever HTML or JSON you want") 
    // it will be certainly processed by your browser 
    } 
}