Включение фильтра CORS для Lagom Java

Я следовал инструкциям Cross-Origin Resource Sharing, чтобы получить доступ к локальному хосту: 9000 (Lagom GateWay, где работают мои микросервисы) с localhost:3000 (где работает мой внешний интерфейс angular). но все же я сталкиваюсь:

XMLHttpRequest cannot load http://localhost:9000/api/myservice. No 'Access-Control-Allow-Origin' header is present on the requested resource 

у кого-нибудь есть образец или проект, в котором работает CORS?


person Amir-Mousavi    schedule 27.10.2016    source источник
comment
вы видите заголовки контроля доступа в заголовке ответа, когда вы открываете URL-адрес в отдельном окне браузера?   -  person Sreekanth    schedule 27.10.2016
comment
@Sreekanth Я использую PostMan, и в методе GET с почтальоном у меня есть следующее в заголовке: Content-Length → 145 Content-Type → application/json; charset=utf-8 Дата → Чт, 27 октября 2016 г., 18:14:09 по Гринвичу   -  person Amir-Mousavi    schedule 27.10.2016
comment
Если вы не видите заголовки Access, это означает, что они не устанавливаются. Когда вы устанавливаете заголовки и исправляете их, вы не должны сталкиваться с этой проблемой. На вашем месте я сначала проверю и получу заголовки ответа в запросе, прежде чем пытаться использовать   -  person Sreekanth    schedule 27.10.2016
comment
да точно, и мой вопрос, как установить заголовки на сервере? инструкция playframework кажется не работает.   -  person Amir-Mousavi    schedule 27.10.2016


Ответы (3)


Это цитата Джеймса Роупера, которую он публикует в группе пользователей Google Lagom.

Самый простой способ заставить CORS работать в Lagom — использовать поддержку CORS в Play (Lagom построен поверх Play):

https://www.playframework.com/documentation/2.5.x/CorsFilter

person Felipe Gusmao    schedule 06.01.2017
comment
А вопрос в группе задавал я :) - person Amir-Mousavi; 07.01.2017

Добавьте класс Filters, который расширяет класс Play.

public class Filters extends DefaultHttpFilters {

  @Inject
  public Filters(CORSFilter corsFilter) {
    super(corsFilter);
  }
}

и добавьте conf, чтобы включить этот фильтр

play.http.filters = "io.my.http.Filters"

вам также может понадобиться настроить фильтр

play.filters.cors {
  allowedOrigins = null
}
person dres    schedule 24.02.2017

Ради других, работающих с интерфейсом Angular 4 и проектом лагом. Мне удалось решить этот путь.

* Я добавил эту строку ниже в свой build.sbt как в API, так и в реализации *

libraryDependencies += фильтры

В моем каталоге impl я создал фильтры папок и добавил код ниже

import play.mvc.EssentialFilter;
import play.filters.cors.CORSFilter;
import play.http.HttpFilters;

import javax.inject.Inject;

public class Filters implements HttpFilters {

    @Inject
    CORSFilter corsFilter;

    public EssentialFilter[] filters() {
        return new EssentialFilter[]{corsFilter.asJava()};
    }
}

В моем application.conf я добавил следующий код

play.filters.hosts {
  # Allow requests to example.com, its subdomains, and localhost:9000.
  allowed = ["localhost:5000", "localhost:9000"]
}

play.http.filters = "filters.Filters"

play.filters.cors {
  # Filter paths by a whitelist of path prefixes
  pathPrefixes = ["/"]

  # The allowed origins. If null, all origins are allowed.
  allowedOrigins = null
  allowedHttpMethods = ["GET", "POST"]
  allowedHttpHeaders = ["Accept"]
  preflightMaxAge = 3 days
}

После этого я перезапустил свои микросервисы lagom, и это сработало как шарм.

person Ano    schedule 20.09.2017