Я хотел проверить, как включить перекрестный поиск домена в Playframework 2.1 (Java). Я не видел никаких документов о том, как это сделать.Разрешение перекрестного разделения доменов
ответ
Не уверен, что это означает 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() {}
Использование языка 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
}
}